Class JButton可用于多个面板
我是Java编程新手,有“初学者问题”。 我已经试着找到是否有人已经有同样的问题,但我找不到任何职位是在我的低水平 我的问题是: 其中一个有两个JPanel(我们称之为Panel1),我实现了一个JTextField(field1)和一个JButton(button1)。在Panel2上,我想画一些东西,这取决于用户在第一个JTextField中的提示 我的问题是我想让Panel2“看到”按钮1(在Panel1中),但我没有做到这一点 有谁能给我一个提示,一个Youtube视频或者类似的东西,在那里我可以看到一个很好的例子,有人处理这样的问题 文图拉你好 另外,我有一个想法,将值传递给Panel2,它应该在这里绘制我想要的东西,这里是我迄今为止的代码(我希望我发布的代码是正确的):这里是Panel1:Class JButton可用于多个面板,class,jpanel,jbutton,actionlistener,Class,Jpanel,Jbutton,Actionlistener,我是Java编程新手,有“初学者问题”。 我已经试着找到是否有人已经有同样的问题,但我找不到任何职位是在我的低水平 我的问题是: 其中一个有两个JPanel(我们称之为Panel1),我实现了一个JTextField(field1)和一个JButton(button1)。在Panel2上,我想画一些东西,这取决于用户在第一个JTextField中的提示 我的问题是我想让Panel2“看到”按钮1(在Panel1中),但我没有做到这一点 有谁能给我一个提示,一个Youtube视频或者类似的东西,在
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的矩形或类似的东西)
如果读起来有点麻烦,我很抱歉。
我在这段代码中遇到的基本问题是,当我想调用该方法时,Panel2中的NullpointerException
设定值(整数b,图形g)
g2.setColor(颜色为青色)
你好,帕特里克我重新设计了大部分
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
一个所有方法都可以使用的类变量。我没有让这些方法每次都使用一个图形变量,而是让它们可以使用类中的变量。每次调用该方法时,我也没有使新的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);
}
}
首先,请注意我是如何没有创建按钮列表的。因为您只使用了一次,所以不需要为它创建新类(代码也更少)
在main()
方法中,我这样做是为了将两个面板添加到相对的一侧,这样它们就不会相互重叠或发生任何事情
最后,我在Panel1
类中创建了一个setSecondPanel
方法,以便该类可以随时使用Panel2
变量。您好,非常感谢您的回答。我应用了你的TIPP,并发布了代码,以明确我的问题所在(我没有发布的主要方法是让它安排清楚。如果它有帮助,你介意投票并检查它吗?嗨,非常感谢你的帮助,这非常有用:)但有一点我仍然没有得到;也许你可以帮我:我希望代码“重新绘制”的东西;正如您在Panel2中的方法“setValue”中所看到的,它说的是g2.fillRect(…),但它实际上并没有在Panel1中绘制矩形,当我将某个东西倾入时。有没有办法解决这个问题?使用repaint()方法。。。另外,完全重新编写代码,因为我做了一些更改,没有问题!如果有帮助的话,你也介意把帖子投上去吗(向上箭头)
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);
}
}