我在使用simple(?)概念时遇到了一个非常令人困惑的问题。我正在尝试学习JFrame
,JPanel
等的基础知识,现在正在尝试实现一个简单的任务。我想要一个大的JFrame
,称为canvas,并且在2 JPanel
的内部彼此相邻,没有边距或其他任何内容。在这两个JPanel中,我有一个覆盖彩色矩形的按钮。当您单击按钮时,该按钮应该消失并显示颜色。我的问题很多。
该代码似乎拥有自己的生命。即使在print语句中使用get消息,也会导致输出更改。至于输出本身,乍一看,看起来不错,两个按钮并排正确命名。
但是,当您单击按钮1时,两个按钮都消失了,右上角出现了名为按钮2的第三个按钮。当您单击新按钮时,它将禁用但不会消失。
有时单击按钮1时,也会出现第三个按钮2,但是原始按钮2仅禁用而不隐藏。此外,整个背景是蓝色,而不是应有的红色和蓝色。当您单击button2时,将发生一组全新的事件,但希望这可能足以帮助您。
非常感谢!
import java.awt.*;
import javax.swing.*;
public class testbig {
public static void main(String[] args) {
JFrame canvas = new JFrame("canvas");
canvas.setSize(400,400);
canvas.setVisible(true);
canvas.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
canvas.setLayout(null);
testinner temp = new testinner("1",Color.blue);
temp.setBounds(0,0,200,400);
canvas.getContentPane().add(temp);
testinner temp2=new testinner("2",Color.red);
temp2.setBounds(200,0,200,400);
canvas.getContentPane().add(temp2);
}
}
public class testinner extends JPanel implements ActionListener{
private JButton button;
private Color color2;
public testinner(String title,Color color) {
super();
color2=color;
setSize(200,400);
setBackground(color);
setLayout(new FlowLayout());
button=new JButton(title);
button.setBounds(getX(), getY(), getWidth(), getHeight());
button.setVisible(true);
button.addActionListener(this);
//panel.add(label);
add(button);
}
public void paintComponent(Graphics gr) {
gr.setColor(color2);
gr.fillRect(getX(), getY(), getWidth(), getHeight());
}
public void actionPerformed( ActionEvent evt){
button.setEnabled(false);
button.setVisible(false);
//System.out.println(this);
//shown.setVisible(true);
}
}
让我们看看您所做的。您已经创建了一个具有空布局的JFrame。因此,这意味着它无法管理其子代的大小或位置。 (有些人可能会说这是一个过失的父母。)
这意味着您的两个JPanels 应该都记住您对它们的setBounds
调用。设置both的大小和位置。因此,您的setSize
通话是多余的。
您已将JPanels设置为具有flowLayout
布局管理器。这意味着他们确实设法管理孩子的大小和位置。它并不总是即时的。
您在按钮上调用setBounds。现在他们真的搞砸了。首先,它们有自己的界限和大小。 不要在非自定义组件上调用setBound。实际上,最好不要使用它。
第一个面板还可以。您将按钮的边界设置为(0,0,200,400)。它位于打算使用的JPanel中。
第二个面板不正常。按钮的边界是(200、0、200、400),组件的宽度是200,因此您要在面板外部留出一定的空间以进行绘制。然后,您的绘画组件也将填充一个矩形在jpanel之外。
所以您的按钮具有一定的大小和位置,第一次让您的布局管理器执行某项操作时,它将改变。
以下代码管理着我认为您正在尝试做的事情。有两个彩色面板,每个面板显示一个JButton。当您单击它消失。删除了一些冗余位后,通常就是您拥有的。
import java.awt.*;
import javax.swing.*;
public class TestBig {
public static void main(String[] args) {
JFrame canvas = new JFrame("canvas");
canvas.setSize(400,400);
canvas.setLayout(null);
JPanel leftPanel = new JPanel();
leftPanel.setOpaque(true);
leftPanel.setBackground(Color.BLUE);
JPanel rightPanel = new JPanel();
rightPanel.setOpaque(true);
rightPanel.setBackground(Color.RED);
JButton left = new JButton("left");
left.addActionListener( evt->{
left.setVisible(false);
});
JButton right = new JButton("right");
right.addActionListener( evt -> {
right.setVisible(false);
});
leftPanel.add(left);
rightPanel.add(right);
canvas.add(leftPanel);
canvas.add(rightPanel);
leftPanel.setBounds( 0, 0, 200, 400);
rightPanel.setBounds(200, 0, 200, 400);
canvas.setVisible(true);
canvas.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}