簡體   English   中英

如何使用 ActionListener 使 JPanel 可見

[英]How to use an ActionListener to make a JPanel Visible

我試圖通過單擊 JButton 使第一個 JPanel 消失,第二個 JPanel 可見。 到目前為止,我只顯示了第一個 JPanel,單擊 JButton 后,框架為空。 我也嘗試用作文來做,所以我不必擴展課程。 所以我對組合如何工作的理解不好可能是問題所在。 我研究了很多,但找不到適合我的問題的解決方案。

第一個JPanel class:

import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;

public class Panel1 {

JPanel firstscreenpanel = new JPanel();
JButton jButton1 = new JButton();
    
Panel1() {
    
    jButton1.setBounds(300,300,400,200);
    jButton1.setBackground(Color.BLACK);
    jButton1.setVisible(true);
    jButton1.addActionListener(new ActionListener() {

    Panel2 test = new Panel2();
            
    public void actionPerformed(ActionEvent e) {
            
        
            firstscreenpanel.setVisible(false); 
            test.secondscreenpanel.setVisible(true);
            
            
            }
    });
    
    
}

public Component panelone() {
    
    firstscreenpanel.setSize(1280, 1024);
    firstscreenpanel.setLayout(null);
    firstscreenpanel.setBackground(Color.BLUE);
    firstscreenpanel.add(jButton1);
    firstscreenpanel.setVisible(true);
    return firstscreenpanel;
            
    }

}

第二個JPanel class:

import java.awt.Color;
import java.awt.Component;
import javax.swing.JButton;
import javax.swing.JPanel;

public class Panel2 {

public JPanel secondscreenpanel = new JPanel();
public JButton jButton2 = new JButton();



Panel2() {
    
    jButton2.setBounds(100,100,400,200);
    jButton2.setBackground(Color.BLACK);
    jButton2.setVisible(true);
            
}
    
public Component paneltwo() {
    
    secondscreenpanel.setSize(1280, 1024);
    secondscreenpanel.setLayout(null);
    secondscreenpanel.add(jButton2);
    secondscreenpanel.setBackground(Color.RED);
    secondscreenpanel.setVisible(false);
    return secondscreenpanel;
            
    }
    }

JFrame Class:

import javax.swing.JFrame;

public class Frame1 {


public JFrame frame1 = new JFrame();
Panel1 panel1 = new Panel1();
Panel2 panel2 = new Panel2();

Frame1() {
    
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame1.setState(JFrame.MAXIMIZED_BOTH);
    frame1.setSize(1280, 1024);
    frame1.setLayout(null);
    frame1.add(panel1.panelone());
    frame1.add(panel2.paneltwo());
    frame1.setVisible(true);
    
            
    }
    }

主要 Class:

    public class MainClass {

        
    private void showGUI() {

    Frame1 jframe = new Frame1();
                        
    }
    
    public static void main(String[] args) {
        
        final MainClass main = new MainClass();
        
        javax.swing.SwingUtilities.invokeLater(new Runnable()

          {
            public void run() {
                main.showGUI();

            }
        
         });
        
      }

        }

我沒有檢查整個代碼(錯誤太多,行太多)但停在Panel2 test = new Panel2();

這個實例是否被添加到某個可見組件中? 如果不是,它將永遠不會顯示。

注意:通常不建議使用null布局管理器,使用CardLayout甚至JTabbedPane來切換組件 - 請參閱教程A Visual Guide to Layout Managers

這不是最好的實現,但它很簡單,您可以遵循。 我修改了您的代碼以創建一個包含原始兩個面板的框架(盡管這些面板類不是必需的 - 正如我在您發布的解決方案的評論中所解釋的那樣),以及一個用於切換面板可見性的按鈕。 我使用的是常規JButton而不是JToggleButton ,也不是 class 的最佳用途,只是為了讓您理解。

動作監聽器被添加到框架上的按鈕中。 請注意,我的動作偵聽器不會創建任何新實例。 那是原始問題的一部分。 由於按鈕與面板 1 和 2 一樣是框架 class 的成員,因此可以直接訪問它們。 所以,在聽眾中,我需要做的就是“切換”每個面板的可見性。

public class Frame1 extends JFrame {
    private Panel1 panel1 = new Panel1();
    private Panel2 panel2 = new Panel2();
    private JPanel btnPanel = new JPanel();
    private JButton button = new JButton("Toggle");

    public Frame1() {
    
        button.addActionListener(new ActionListener() {
        
            @Override
            public void actionPerformed(ActionEvent arg0) {
                boolean visible = panel1.isVisible();
                panel1.setVisible(!visible);
                panel2.setVisible(visible);
            
            }
        });

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setState(JFrame.MAXIMIZED_BOTH);
        setSize(1280, 1024);
        btnPanel.setSize(400, 100);
        btnPanel.add(button);
        setLayout(null);
        add(panel1);
        add(panel2);
        add(btnPanel);
    }
}

public class Panel1 extends JPanel {

    public Panel1() {
        setBounds(100,100,400,200);
        setBackground(Color.RED);
        setVisible(true);
    }
}

public class Panel2 extends JPanel {

    public Panel2() {
        setBounds(100,100,400,200);
        setBackground(Color.BLACK);
        setVisible(false);
    }
}

public class MainClass {

    private void showGUI() {

        Frame1 jframe = new Frame1();
        jframe.setVisible(true);
    }

    public static void main(String[] args) {

        final MainClass main = new MainClass();
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                main.showGUI();

            }

        });
    }
}

我通過將“公共靜態”添加到“Panel2 panel2 = new Panel2();”解決了我的問題

然后我就用了:

“Frame1.panel2.secondscreenpanel.setVisible(true);”

在 JButton ActionListener 中。

它現在可以工作,但我想那是一種不好的做法。 因為我聽說使用太多 static 並不是那么好。 但我現在還不知道為什么。

您可以通過將框架的引用傳遞給您的 panel1 來修復您的程序。 請參閱下面的示例。

車架 class

import javax.swing.*;

public class Frame1 {

    private JFrame frame = new JFrame();
    private Panel1 panel1;
    private Panel2 panel2;

    Frame1() {
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.setState(JFrame.MAXIMIZED_BOTH);
         frame.setSize(1280, 1024);
         frame.setLayout(null);
         panel1 = new Panel1(this);
         frame.add(panel1.getPanel());
         panel2 = new Panel2();
         frame.add(panel2.getPanel());
         frame.setVisible(true);
    }

    public Panel2 getPanel2() {
        return panel2;
    }

}

面板1 class

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Panel1 {
    private JPanel panel = new JPanel();
    private Frame1 frame1;
    private JButton jButton1 = new JButton();

    public Panel1(Frame1 frame1) {
        this.frame1 = frame1;
        panel.setSize(1280, 1024);
        panel.setLayout(null);
        panel.setBackground(Color.BLUE);
        panel.add(jButton1);
        panel.setVisible(true);
        jButton1.setBounds(300,300,400,200);
        jButton1.setBackground(Color.BLACK);
        jButton1.setVisible(true);
        jButton1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                panel.setVisible(false);
                frame1.getPanel2().getPanel().setVisible(true);
            }
        });
    }

    public JPanel getPanel() {
         return panel;
    }
}

面板2 class

import javax.swing.*;
import java.awt.*;

public class Panel2 {
     private JButton jButton2 = new JButton();
     private JPanel panel = new JPanel();

    public Panel2() {
        panel.setSize(1280, 1024);
        panel.setLayout(null);
        panel.add(jButton2);
        panel.setBackground(Color.RED);
        panel.setVisible(false);

        jButton2.setBounds(100,100,400,200);
        jButton2.setBackground(Color.BLACK);
        jButton2.setVisible(true);
    }

    public JPanel getPanel() {
        return panel;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM