【问题标题】:Java Swing CardLayout multiple filesJava Swing CardLayout 多个文件
【发布时间】:2017-02-21 06:31:00
【问题描述】:

我试图让这段代码工作,这样我就有一个卡片布局容器,每个面板都在自己的类和实际文件中定义。这段代码不是 100% 我自己的,是另一个 Stack 溢出用户对我以前的东西的修改版本。这或多或少是我需要的,但我需要它以使其不是自动化的,我可以编写 15 个不同的面板,每个面板都做出决定。 Main 和 Arrow 类已被所述用户修改,Imagepanel 是我尝试编写一个将被代码的工作部分接受的类。问题是我插入到容器中的 Imagepanel 将注册为现有,但面板上没有显示任何内容,它是空白的。 ImagePanel 中被注释掉的部分是我设置在次要位置的代码,以支持之前在 Arrow 类中使用的既定内容。

这是主类

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.*;
import javax.swing.*;

public class Main extends JPanel {
   private Arrow arrow = new Arrow();   //creates a new Arrow object

public Main() {
    JPanel btnPanel = new JPanel();
    btnPanel.add(new JButton(new NextAction("Next")));     

    setLayout(new BorderLayout());
    add(arrow, BorderLayout.NORTH);
    add(btnPanel, BorderLayout.PAGE_END);
}

private class NextAction extends AbstractAction {
    public NextAction(String name) {
        super(name);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        arrow.next();  // *** call arrow's public next method that you created

        // no need to make a new CardLayout instance
    }
}

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

    JFrame frame = new JFrame("Iowa Budget Simulation");
    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(() -> createAndShowGui());
}

}

这里是创建容器的 Arrow 类

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagLayout;

import javax.swing.*;

class Arrow extends JPanel {
    private static final long serialVersionUID = 1L;
    private CardLayout cardLayout = new CardLayout();       // make me a field
    private JPanel cardHolder = new JPanel(cardLayout);     //creates a master JPanel

public Arrow() {
    for (int i = 0; i < 5; i++) {
        cardHolder.add(createCard(i), "card " + i);
    }
    ImagePanel pear = new ImagePanel();
    cardHolder.add(pear, "Pear");
    setLayout(new BorderLayout());
    add(cardHolder, BorderLayout.NORTH);

}

// public method that other objects can call
public void next() {
    cardLayout.next(cardHolder);  // call next on the correct object
}

// simply creates a "pretty" new JPanel
private JComponent createCard(int i) {
    JLabel label = new JLabel("Card " + i);
    label.setFont(label.getFont().deriveFont(Font.BOLD, 50f));

    float h = (float)Math.random();
    Color c = Color.getHSBColor(h, 1f, 1f);
    label.setForeground(c.darker());

    JPanel panel = new JPanel(new GridBagLayout());
    panel.add(label);
    panel.setBorder(BorderFactory.createLineBorder(c.darker(), 20));
    panel.setBackground(c.brighter().brighter());

    panel.setPreferredSize(new Dimension(400, 300));
    return panel;
}

这是 ImagePanel,我在第三个单独的面板/类中的尝试

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagLayout;

import javax.swing.*;

class ImagePanel extends JPanel {

    private static final long serialVersionUID = 1L;
    private String imgString;
    private JLabel imgLabel;

public JComponent ImagePanel() {
    /*
    setName("Pear");
    JLabel john = new JLabel("Pear");   

    float h = (float)Math.random();
    Color c = Color.getHSBColor(h, 1f, 1f);
    john.setForeground(c.darker());

    JPanel panel = new JPanel(new GridBagLayout());
    panel.add(john);
    panel.setBorder(BorderFactory.createLineBorder(c.darker(), 20));
    panel.setBackground(c.brighter().brighter());
    // Ensure size is correct even before any image is loaded.
    setPreferredSize(new Dimension(400, 300));
    return panel;
    */

    JLabel label = new JLabel("Pear");
    label.setFont(label.getFont().deriveFont(Font.BOLD, 50f));

    float h = (float)Math.random();
    Color c = Color.getHSBColor(h, 1f, 1f);
    label.setForeground(c.darker());

    JPanel panel = new JPanel(new GridBagLayout());
    panel.add(label);
    panel.setBorder(BorderFactory.createLineBorder(c.darker(), 20));
    panel.setBackground(c.brighter().brighter());

    panel.setPreferredSize(new Dimension(400, 300));
    return panel;
}

发布没有错误,它只是显示一个空白面板。感谢您为我提供的任何帮助,在我通过 YouTube 和堆栈溢出学习 Java Swing GUI 时,我提前道歉。

【问题讨论】:

  • ImagePanel() 不会做任何事情(它将创建一个空组件),而是将public JComponent ImagePanel() { 更改为public ImagePanel() {,这样你现在就有了一个构造函数。删除 JPanel panel = new JPanel(new GridBagLayout()); 并简单地调用 setLayout(new GridBagLayout()); 并删除对 panel 的其他引用,它应该开始工作

标签: java swing jpanel layout-manager cardlayout


【解决方案1】:

public JComponent ImagePanel() { 不是构造函数,它是一种方法,要使其在您的代码中工作,您必须将 ImagePanel pear = new ImagePanel(); 更改为 JComponent pear = new ImagePanel().ImagePanel();,但坦率地说,这并没有多大意义。

改为将public JComponent ImagePanel() { 更改为public ImagePanel() {,现在它是类的构造函数

接下来,改变...

JPanel panel = new JPanel(new GridBagLayout());
panel.add(label);
panel.setBorder(BorderFactory.createLineBorder(c.darker(), 20));
panel.setBackground(c.brighter().brighter());

panel.setPreferredSize(new Dimension(400, 300));
return panel;

setLayout(new GridBagLayout());
add(label);
setBorder(BorderFactory.createLineBorder(c.darker(), 20));
setBackground(c.brighter().brighter());

//panel.setPreferredSize(new Dimension(400, 300));
//return panel;

不要让我开始解释为什么 setPreferredSize 是个坏主意

现在你可以简单地使用

ImagePanel pear = new ImagePanel();
cardHolder.add(pear, "Pear");

【讨论】:

  • 解释为什么使用setPreferredSize() 是个坏主意……不明智的想法:stackoverflow.com/a/26828479/1368690。基本上,当您使用 setPreferredSize() 时,您不允许组件计算它需要的确切尺寸,这可能会导致部件被切断或额外空间。
  • @hamena314 谢谢,我知道,这不是“坏”或“不明智”,而是它在没有考虑的情况下被过度使用,并且覆盖 getPreferredSize 通常是一个更好的选择,因为容器通常有更好的想法它需要多少空间
猜你喜欢
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2020-02-01
  • 2016-09-03
  • 2014-07-23
  • 2011-07-14
相关资源
最近更新 更多