1

我对 Java 图形用户界面非常缺乏经验,我只使用 Java 的 GUI 库,因为它对我目前想要实现的目标很方便。我有一个 JPanel,其中有……多个问题。

  • JEdi​​torPane 位于文本之上,使 JLabel 黯然失色。
  • JPanel 周围没有出现边框。
  • 当 GUI 打开时,它的大小被调整到最小。
  • JEdi​​torPane 未调整大小。
  • 尝试添加网格布局不起作用。它读到我的Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: cannot add to layout: constraint must be a string (or null)错误。
  • 为新手问题欢呼:如何添加边框?

这是我的代码:

import java.awt.*;
import java.awt.event.*; 
import java.awt.image.*;
import java.io.*;    
import javax.imageio.*;
import javax.swing.*; 
import javax.activation.MimetypesFileTypeMap;


public class UpdateMechanism {
    private static void showGUI() {
        JFrame frame = new JFrame("The Neverhood Restoration Project");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        BufferedImage icoImage = null;
        try {
            icoImage = ImageIO.read(
                frame.getClass().getResource("/nhood.bmp"));
        } catch (IOException e) {
            System.out.println(e);
        }
        frame.setIconImage(icoImage);

        JPanel heapPanel = new JPanel(); 
        frame.setSize(new Dimension(1024, 600));
        heapPanel.setBackground(new Color(0xA64343));

        JLabel headerLabel = new JLabel("The Neverhood Restoration Project");
        headerLabel.setHorizontalTextPosition(JLabel.CENTER);

        try {
            Font sFont = Font.createFont(Font.TRUETYPE_FONT, new File("DUGFB___.TTF")); 
            sFont = sFont.deriveFont(Font.PLAIN, 48);
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
            ge.registerFont(sFont);
            headerLabel.setFont(sFont);
        } catch (FontFormatException|IOException e) { 
            System.out.println(e); 
        }

        JEditorPane updateLog = new JEditorPane(); 
        updateLog.setSize(800, Short.MAX_VALUE);
        JScrollPane scrollPane = new JScrollPane(updateLog);   
        updateLog.setEditable(false);   

        try {
            updateLog.setPage("http://theneverhood.sourceforge.net/");
        } catch (IOException e) {
            updateLog.setContentType("text/html");
            updateLog.setText("<html>The application could not load the webpage.</html>");
        }   

        frame.add(headerLabel);
        frame.add(scrollPane);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                showGUI();
            }
        });
    }
}
4

2 回答 2

2

不要在组件上使用 setSize() 方法。布局管理器可以使用首选/最小/最大尺寸来确定如何根据布局管理器的规则布置组件。而是做

//updateLog.setSize(800, Short.MAX_VALUE);
JScrollPane scrollPane = new JScrollPane(updateLog);   
scrollPane.setPreferredSize( new Dimension(800, 400) );

JEdi​​torPane 位于文本之上,使 JLabel 黯然失色。

JFrame 默认使用 BorderLayout。此外,默认情况下,所有组件都会添加到中心,但仅显示最后添加的组件。尝试:

//frame.add(headerLabel);
frame.add(headerLabel, BorderLayout.NORTH);

这行代码什么也不做,因为您稍后会在帧上调用 pack():

frame.setSize(new Dimension(1024, 600));

如何添加边框?

请参阅 Swing 教程中有关如何使用边框的部分。阅读教程中的其他部分也没有什么坏处。布局管理器上有一个。

编辑:

如何将“BorderLayout.NORTH”中的文本居中

阅读 JLabel API。您应该使用另一种 setHorizo​​ntalXXX() 方法,而不是您尝试使用的方法:

为什么他的背景颜色不显示?

什么是堆面板?为什么设置它的颜色会做任何事情?您没有将面板添加到框架或向其中添加任何组件。

如果要更改框架的背景,则需要访问内容窗格。再次了解为什么您需要阅读有关如何制作框架的 Swing 教程,该教程解释了内容窗格。

    frame.getContentPane().setBackground(new Color(0xA64343));

为什么他的背景颜色不显示?

于 2013-03-23T00:41:27.163 回答
2

您正在将两个组件添加到框架CENTER的默认位置。BorderLayout如果您将标头添加到 中NORTH,则效果很好。

setSize如果您调用,请不要调用框架pack()

updateLog.setSize(800, Short.MAX_VALUE);也是无用的,因为包装滚动窗格的视口也有自己的布局,它将覆盖您的调用。

关于边界,您可以调用setBorder并提供任何工厂值BorderFactory或提供您自己的实现。

查看您的代码的更新版本:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.GraphicsEnvironment;
import java.io.File;
import java.io.IOException;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class UpdateMechanism {
    private static void showGUI() {
        JFrame frame = new JFrame("The Neverhood Restoration Project");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel heapPanel = new JPanel();
        frame.setSize(new Dimension(1024, 600));
        heapPanel.setBackground(new Color(0xA64343));

        JLabel headerLabel = new JLabel("The Neverhood Restoration Project");
        headerLabel.setHorizontalTextPosition(JLabel.CENTER);

        try {
            Font sFont = Font.createFont(Font.TRUETYPE_FONT, new File("DUGFB___.TTF"));
            sFont = sFont.deriveFont(Font.PLAIN, 48);
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            ge.registerFont(sFont);
            headerLabel.setFont(sFont);
        } catch (FontFormatException | IOException e) {
            System.out.println(e);
        }

        JEditorPane updateLog = new JEditorPane();
        JScrollPane scrollPane = new JScrollPane(updateLog);
        updateLog.setEditable(false);

        try {
            updateLog.setPage("http://theneverhood.sourceforge.net/");
        } catch (IOException e) {
            updateLog.setContentType("text/html");
            updateLog.setText("<html>The application could not load the webpage.</html>");
        }

        frame.add(headerLabel, BorderLayout.NORTH);
        frame.add(scrollPane);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                showGUI();
            }
        });
    }
}
于 2013-03-23T00:44:16.690 回答