gpt4 book ai didi

java - 将当前 JPanel 分配给 JPanel 的新实例但不刷新

转载 作者:行者123 更新时间:2023-11-29 02:58:55 25 4
gpt4 key购买 nike

我对 JPanel 进行了子类化,以提供一个通用的 JPanel 容器,其中包含从 JComboBox 中选择的过滤器的选项。

当 JComboBox 从一个过滤器更改为另一个过滤器时,我有一个 switch 语句来检查现在选择了哪个过滤器并将“选项”JPanel 重新分配给与该过滤器关联的选项类的新实例:

public void setFilterOptions(String choice){
switch(choice){
case "Gaussian": options = new GaussianFilterOptions();break;
case "Sobel": options = new SobelFilterOptions();System.out.println("?");break;
}
}

问题是调用 setFilterOptions 后 JPanel“选项”在 GUI 中没有刷新。默认情况下设置为显示的过滤器会在启动时出现,并且即使我切换 JComboBox 选择也会保留。我已经尝试重新绘制、重新验证和验证“选项”以及包含“选项”的 JPanel 和包含整个应用程序的 JFrame。

我在每种情况下都添加了打印语句,以验证它们在组合框切换时是否正常工作并且没有掉线,所以我确定这不是问题所在。

最佳答案

您将变量与对象混淆了。您可能最初将选项引用的 JPanel 对象放置到 GUI 中,但请理解,您没有将选项变量放置到 GUI 中,而是(又一次)JPanel 对象它引用到 GUI 中。

如果稍后您更改选项变量引用的 JPanel,这将对 GUI 没有影响,因为它仍然包含相同的原始 JPanel 它之前持有的对象。如果要更改显示的 JPanel,则必须直接通过在 GUI 中换出 JPanel 来进行。这最好通过使用 CardLayout 来完成。 .

例如,

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

public class SwapPanels extends JPanel {
private static final String GAUSSIAN = "Gaussian";
private static final String SOBEL = "Sobel";
private static final String[] FILTER_OPTIONS = {GAUSSIAN, SOBEL};
private CardLayout cardLayout = new CardLayout();
private JPanel cardHolderPanel = new JPanel(cardLayout);
private JPanel gaussianPanel = new JPanel();
private JPanel sobelPanel = new JPanel();
private JComboBox<String> filterCombo = new JComboBox<>(FILTER_OPTIONS);

public SwapPanels() {
JPanel comboPanel = new JPanel();
comboPanel.add(filterCombo);
filterCombo.addActionListener(new ComboListener());

gaussianPanel.add(new JLabel("Gaussian Filtering Done Here"));
sobelPanel.add(new JLabel("Sobel Filtering Done Here"));
cardHolderPanel.add(gaussianPanel, GAUSSIAN);
cardHolderPanel.add(sobelPanel, SOBEL);
int gap = 50;
cardHolderPanel.setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));

setLayout(new BorderLayout());
add(cardHolderPanel, BorderLayout.CENTER);
add(comboPanel, BorderLayout.PAGE_END);
}

private class ComboListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String key = (String) filterCombo.getSelectedItem();
cardLayout.show(cardHolderPanel, key);
}
}

private static void createAndShowGui() {
SwapPanels mainPanel = new SwapPanels();

JFrame frame = new JFrame("SwapPanels");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

关于java - 将当前 JPanel 分配给 JPanel 的新实例但不刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36416256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com