gpt4 book ai didi

java - 是否可以选择在不禁用 CardLayout 的情况下添加 ScrollPane?

转载 作者:行者123 更新时间:2023-12-02 01:17:51 25 4
gpt4 key购买 nike

我有一个卡片布局,我可以使用按钮切换面板。但是,代码(切换面板)仅在以下行时有效:

    JScrollPane scrPane = new JScrollPane(card1);
frame.add(scrPane);

已被删除。在其他情况下,单击按钮不会产生任何效果。是否有一个选项可以保持滚动(我需要这个,因为主应用程序将有很多换行文本)而不禁用切换卡的选项?

package com.code;

import javax.swing.*;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.awt.event.*;

public class Card {

public static void main(String[] args) {

JFrame frame = new JFrame("App");
frame.setVisible(true);
frame.setSize(1200, 800);//Give it a size
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

JPanel mainPanel = new JPanel(new CardLayout());
frame.add(mainPanel);

JPanel menu = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel card1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel card2 = new JPanel(new FlowLayout(FlowLayout.LEFT));

mainPanel.add(menu, "menu");
mainPanel.add(card1, "card1");
mainPanel.add(card2, "card2");

JLabel l1 = new JLabel("label 1");
JLabel l2 = new JLabel("label 2");
card1.add(l1);
card2.add(l2);
JButton click = new JButton("Click!");
menu.add(click);

JScrollPane scrPane = new JScrollPane(card1);
frame.add(scrPane);

click.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
CardLayout cardLayout = (CardLayout) mainPanel.getLayout();
cardLayout.show(mainPanel, "card1");
}
});

}

}

最佳答案

A JFrame(其内容 Pane )uses BorderLayout默认情况下。这意味着您在 BorderLayout.CENTER 处只能有 1 个组件。当您frame.add(component)时,默认约束是BorderLayout.CENTER

现在,您frame.add(mainPanel);,然后frame.add(scrPane);。因此主面板被删除,因为 scrPane 被添加到它之后。

执行 JScrollPane scrPane = new JScrollPane(card1); 意味着您将滚动 Pane 添加到card1,而不是在内容 Pane 中。我猜你希望它到内容 Pane (整个框架)。因此解决方法是删除 frame.add(mainPanel); 并执行以下操作:

JScrollPane scrPane = new JScrollPane(mainPanel);
frame.add(scrPane);

现在,主面板已添加到 scrPane 中,并且 scrPane 已添加到框架中。

但是,此后您的 GUI 将是空的,因为您在完成向其中添加组件之前 frame.setVisible(true); 。看看Why shouldn't I call setVisible(true) before adding components?

最终,完整代码为:

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("App");

frame.setSize(1200, 800);//Give it a size
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

JPanel mainPanel = new JPanel(new CardLayout());

JPanel menu = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel card1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel card2 = new JPanel(new FlowLayout(FlowLayout.LEFT));

mainPanel.add(menu, "menu");
mainPanel.add(card1, "card1");
mainPanel.add(card2, "card2");

JLabel l1 = new JLabel("label 1");
JLabel l2 = new JLabel("label 2");
card1.add(l1);
card2.add(l2);
JButton click = new JButton("Click!");
menu.add(click);

JScrollPane scrPane = new JScrollPane(mainPanel);
frame.add(scrPane);

click.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
CardLayout cardLayout = (CardLayout) mainPanel.getLayout();
cardLayout.show(mainPanel, "card1");
}
});
frame.setVisible(true);
});
}

我建议您阅读的一些不错的链接是 the Initial ThreadsWhat does .pack() do?

关于java - 是否可以选择在不禁用 CardLayout 的情况下添加 ScrollPane?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58240964/

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