【问题标题】:JButton accessible for several Panels可用于多个面板的 JButton
【发布时间】:2016-04-09 14:39:14
【问题描述】:

我是 Java 编程新手,有“初学者问题”。 我已经尝试查找是否有人已经遇到了同样的问题,但是我找不到任何属于我的低级别的帖子。

我的问题: 我在其中一个中有 2 个 JPanel,(我们称之为 Panel1)我实现了一个 JTextField(field1)和一个 JButton(button1)。在 Panel2 上,我想画一些东西,这取决于第一个 JTextField 中使用的内容。

我的问题是我希望 Panel2“看到”那个 button1(在 Panel1 中),但我没能做到。

谁能给我一个提示,一个 Youtube 视频或类似的东西,我可以看到一个很好的例子来处理这样的问题?

你好文图拉

P.S 我有一个想法将值传递给 Panel2,它应该在其中绘制我想要的那些东西,这是我的代码到目前为止(我希望我正确发布它):这里是 Panel1:

public class Panel1 extends JPanel
{
    public JButton button = new JButton("OK");
    public JTextField field1 = new JTextField(5);
    public String name;int b;

public Panel1()
{
    setBackground(Color.WHITE);  
    add(field1);
    add(button);
    ButtonListener listener = new ButtonListener(field1);
    button.addActionListener(listener);  
}
public Dimension getPreferredSize()
{
    return new Dimension(400,400);
}
}

这里是 ButtonListener:

class ButtonListener implements ActionListener        
{       
Graphics g;
//Graphics2D g2 = (Graphics2D) g;
    public Panel2 pan2 = new Panel2();
    public String name;
    public JTextField field1 = new JTextField();
    int b;
    public ButtonListener(JTextField field1)
    {this.field1 = field1;} 

    public void actionPerformed(ActionEvent e) 
    {
        String op = e.getActionCommand();
        if(op.equals("OK"))
        {   
            name = field1.getText();
        try
            {
                b = Integer.parseInt(name);
                JOptionPane.showMessageDialog(null,"Ihre Zahl = "+b);
                pan2.setvalue(b,g);
            }
        catch(NumberFormatException ex)  {JOptionPane.showMessageDialog(null,"Please enter real numbers!");}
        }
    }
    }

最后是 Panel2,我想根据 Panel1 中给出的输入来绘制东西(例如:我输入 10,他给我画了一个宽度为 10 的矩形或类似的东西)

public class Panel2 extends JPanel
{    
Graphics g;
Graphics2D g2 = (Graphics2D) g;

public int b;
public Panel2()
{       
    setBackground(Color.YELLOW);
}

public void paintComponent(Graphics g)
{
    Graphics2D g2 = (Graphics2D) g;
    super.paintComponent(g);
    g2.setColor(Color.RED);
    g2.fillRect(200, 200, 50, 50);
    Paint2(g);
}
public void Paint2(Graphics g)
{
    this.g = g;
    Graphics2D g2 = (Graphics2D) g;
    //super.paintComponent(g);
    System.out.println("TEST2");
    g2.setColor(Color.BLUE);
    //System.out.println("TEST3");
    g2.fillRect(10 , 10, 40, 40);
}
public void setvalue(int b, Graphics g)
{
this.b = b; 
this.g = g;
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.CYAN);
g2.fillRect(0, 0, 40, 40);
System.out.println("B ist gleich = "+b);
//Paint2(g2);
}
public Dimension getPreferredSize()
{
return new Dimension(400,400);
}

如果阅读起来有点麻烦,我很抱歉。 我在这段代码中遇到的基本问题是当我想调用方法时 Panel2 中的 NullpointerException

setvalue(int b, 图形 g) g2.setColor(Color.Cyan)

问候帕特里克

【问题讨论】:

    标签: class jpanel jbutton actionlistener


    【解决方案1】:

    我对@9​​87654321@ 的大部分部分进行了重新设计,对Panel2 进行了一些重新设计。

    我将从 Panel2 开始,因为它更简单。这是新代码:

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    
    import javax.swing.JPanel;
    
    public class Panel2 extends JPanel {
        Graphics g;
        Graphics2D g2;
    
        public int b;
    
        public Panel2() {
            setBackground(Color.YELLOW);
            b = 50;
        }
    
        @Override
        public void paintComponent(Graphics g) {
            g2 = (Graphics2D) g;
            super.paintComponent(g);
            g2.setColor(Color.RED);
            g2.fillRect(200, 200, 50, 50);
    
            g2.setColor(Color.BLUE);
            g2.fillRect(10, 10, 40, 40);
    
            g2.setColor(Color.CYAN);
            g2.fillRect(b, b, 40, 40);
        }
    
        public void setValue(int b) {
            this.b = b;
            System.out.println("B ist gleich = " + b);
            repaint();
        }
    
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }
        }
    

    我对 Panel2 所做的最大更改是我将g2 设置为一个所有方法都可以使用的类变量。我没有让这些方法每次都使用一个 Graphics 变量,而是让它们可以使用类中的变量。每次调用该方法时,我也没有使新的 Graphics2D 变量“等于”任何东西,因为没有必要这样做。我唯一更新它的地方是paintComponent() 方法,这样我就可以为整个班级更新一次。

    接下来是 Panel1。代码如下:

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    
    public class Panel1 extends JPanel {
        public JButton button = new JButton("OK");
        public JTextField field1 = new JTextField(5);
        public String name;
        int b;
        private Panel2 pan2;
    
        public Panel1() {
        setBackground(Color.WHITE);
        add(field1);
        add(button);
        ActionListener listener = new ActionListener() {
    
            @Override
            public void actionPerformed(ActionEvent e) {
                String op = e.getActionCommand();
                if (op.equals("OK")) {
                    name = field1.getText();
                    try {
                        b = Integer.parseInt(name);
                        pan2.setValue(b);
                        JOptionPane.showMessageDialog(null, "Ihre Zahl = " + b);
                    } catch (NumberFormatException ex) {
                        JOptionPane.showMessageDialog(null, "Please enter real numbers!");
                    }
                }
    
            }
        };
        button.addActionListener(listener);
    }
    
    public void setSecondPanel(Panel2 panel) {
        pan2 = panel;
    }
    
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(400, 400);
    }
    
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        Panel1 pan1 = new Panel1();
        Panel2 pan2 = new Panel2();
        pan1.setSecondPanel(pan2);
        frame.setSize(pan1.getPreferredSize().width + pan2.getPreferredSize().width, pan1.getPreferredSize().height);
        frame.add(pan2, BorderLayout.EAST);
        frame.add(pan1, BorderLayout.WEST);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    
    }
    

    首先,请注意我没有创建ButtonListener。因为您只使用它一次,所以无需为它创建一个新类(代码也更少)。

    main() 方法中,我这样做是为了将两个面板添加到相对的两侧,这样它们就不会相互重叠或任何东西。

    最后,我在Panel1 类中创建了一个setSecondPanel 方法,以便该类可以随时使用Panel2 变量。

    【讨论】:

    • 您好,非常感谢您的回答。我应用了您的提示并发布了代码以明确我的问题在哪里(我不发布的主要方法是为了让它清楚地安排。
    • 如果有帮助,您介意点赞并勾选吗?
    • 您好,非常感谢您的帮助,它非常有用:) 但是有一点我仍然没有得到;也许你可以在那里帮助我:我想要代码来“重新绘制”东西;正如您在 Panel2 中的“setValue”方法中看到的那样,它说 g2.fillRect(...) 但实际上当我倾倒东西时,它并没有在 Panel1 中绘制矩形。有没有办法解决这个问题?
    • 使用 repaint() 方法...另外,完全重新粘贴代码,因为我做了一些更改
    • 没问题!如果有帮助,您是否也介意为帖子投票(向上箭头)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多