java - 如何更改不同 Java 类中面板上的 setVisible()

标签 java swing jpanel mouse-listeners

package com.spiralfive.inventory;

import java.awt.Font;
import java.awt.Panel;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.BorderLayout;

import javax.swing.JApplet;
import javax.swing.JButton;

public class MainFile extends JApplet implements MouseListener {

// Declare the initial components
private JButton btnNewInventory;
private JButton btnMarkDown;
private JButton btnProcessSales;
private JButton btnActive;
private JButton btnStats;
private Panel mainPanel;
private Panel menuPanel;
private Panel inventoryPanel;
private Panel setactivePanel;

// Call the Initializer...
public void init() {
    initComponents();
}

// Initialize the Main Components - Mostly Menu Items
private void initComponents() {

    // Main Form Components
    mainPanel = new Panel();
    menuPanel = new Panel();
    inventoryPanel = new Panel();
    setactivePanel = new Panel();
    btnNewInventory = new JButton("New Inventory");
    btnActive = new JButton("Set Active");
    btnMarkDown = new JButton("Mark Down");
    btnProcessSales = new JButton("Process Sale");
    btnStats = new JButton("Statistics");

    // Enable Mouse Interactivity
    btnNewInventory.addMouseListener(this);
    btnMarkDown.addMouseListener(this);
    btnProcessSales.addMouseListener(this);
    btnActive.addMouseListener(this);
    btnStats.addMouseListener(this);

    // Set the Fonts
    Font buttonFont = new Font("Arial", Font.PLAIN, 20);

    // Apply Fonts To Menu
    btnNewInventory.setFont(buttonFont);
    btnMarkDown.setFont(buttonFont);
    btnProcessSales.setFont(buttonFont);
    btnActive.setFont(buttonFont);
    btnStats.setFont(buttonFont);

    // Set Panel Layout For Menu Items
    menuPanel.setLayout(new java.awt.GridLayout(1,6));

    // Add the Components
    menuPanel.add(btnNewInventory);
    menuPanel.add(btnActive);
    menuPanel.add(btnMarkDown);
    menuPanel.add(btnProcessSales);
    menuPanel.add(btnStats);

    // Add The Menu To the Main Panel
    mainPanel.add(BorderLayout.NORTH, menuPanel);

    // Make Inventory Load by Default
    createPanels();
    makeInvVisible();

    // Set It All Visible
    add(mainPanel);

}

// Create the Panels Used in this applet
public void createPanels() {
    NewInventory inventoryPanel = new NewInventory();
    inventoryPanel.setLayout(new java.awt.GridLayout(6,2));
    mainPanel.add(BorderLayout.CENTER, inventoryPanel);

    SetActive setactivePanel = new SetActive();
    setactivePanel.setLayout(new java.awt.GridLayout(6,2));
    mainPanel.add(BorderLayout.CENTER, setactivePanel);

}

public void makeInvVisible() {
    inventoryPanel.setVisible(true);
    mainPanel.repaint();
}

public void makeInvDisappear() {
    inventoryPanel.setVisible(false);
    mainPanel.repaint();
}

public void makeActiveVisible() {
    setactivePanel.setVisible(true);
    mainPanel.repaint();
}

public void makeActiveDisppear() {
    setactivePanel.setVisible(false);
    mainPanel.repaint();
}

public void mouseClicked(MouseEvent e) {

    // Determine Which Button Has Been Clicked
    JButton currentButton = (JButton)e.getComponent();

    // New Inventory Button
    if(currentButton == btnNewInventory) {
        makeInvVisible();
        makeActiveDisppear();
    }

    // Set Active Button
    else if(currentButton == btnActive) {
        makeActiveVisible();
        makeInvDisappear();
    }
}

public void mousePressed(MouseEvent e) {}

public void mouseReleased(MouseEvent e) {}

public void mouseEntered(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}

}

我正在使用上面的代码尝试使用 setVisible 单击按钮时出现一个新的 Panel() 并消失现有的面板。但是,我无法更改 Panel()。单击按钮时不会发生任何事情,这些按钮设置为将当前面板上的 setVisible 更改为 false,而在请求的面板上将 setVisible 更改为 true。

我相当确定这是因为面板在不同的类(initComponents)中设置为私有(private)。如何访问面板上的 setVisible 属性?或者,这就是问题所在吗?

最佳答案

添加

this.validate();

在 makeActiveVisible() 方法中。

Swing 组件的默认状态为无效,除非经过验证(通过在组件本身或父容器之一上调用 .validate() 方法),否则不会绘制到屏幕上。

另请参阅

repaint() in Java

关于java - 如何更改不同 Java 类中面板上的 setVisible(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18038025/

相关文章:

java - Apache Spark——Java,组直播流数据

java - Androidplot错误: Cannot resolve getGraphWidget and other method

java - 从 Hashmap 填充 JList 并检索键

java - 如何阻止 JOptionPane 禁用根框架

java - 如何在 FlowLayout 或 GridLayout 中手动放置组件?

java - android如何在适配器内部调用startActivityForResult

java - 弹出并叠加页面

java - 无法将 addActionListener 添加到给定类型?

Java 在 JPanel 内声明serialVersionUID 时出错

java - 在 JPanel 中绘图时出现问题