将JButton内的JPanel内的JButton放置在结果可变的地方

问题描述 投票:-1回答:1

我在使用simple(?)概念时遇到了一个非常令人困惑的问题。我正在尝试学习JFrameJPanel等的基础知识,现在正在尝试实现一个简单的任务。我想要一个大的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);
    }
}
java jframe jpanel jbutton actionlistener
1个回答
0
投票

让我们看看您所做的。您已经创建了一个具有空布局的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 );
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.