JButton可访问多个小组

时间:2016-04-09 14:39:14

标签: class jpanel jbutton actionlistener

我是Java编程的新手,并且有“初学者问题”。 我已经试图找到一个已经有同样问题的人,但我找不到任何低级别的帖子。

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

我的问题是我希望Panel2“看到”那个按钮1(在Panel1中),我无法做到。

任何人都可以给我一个提示,一个Youtube视频或类似的东西,在那里我可以看到一个很好的例子,有人处理这样的问题吗?

Greetings Ventura

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!");}
        }
    }
    }

最后我想基于Panel1中给出的输入绘制内容的Panel2(例如:我输入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);
}

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

  

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

问候帕特里克

1 个答案:

答案 0 :(得分:0)

我对Panel1的大多数进行了重新设计,并对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()方法中,我制作了它,以便将两个面板添加到相对的两侧,以便它们不会相互重叠或任何重叠。

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