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()メソッドを使用しないでください。レイアウトマネージャーは、優先/最小/最大サイズを使用して、レイアウトマネージャーのルールに基づいてコンポーネントをレイアウトする方法を決定できます(MAY)。代わりに

//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チュートリアルのセクションを参照してください。チュチュリアルの他のセクションも読んでも問題ありません。レイアウトマネージャーに1つあります。

編集:

「BorderLayout.NORTH」内のテキストを中央に配置するにはどうすればよいですか。

JLabelAPIをお読みください。使用しようとしたメソッドの代わりに使用する必要がある別のsetHorizo​​ntalXXX()メソッドがあります。

なぜ彼は背景色が表示されないのですか?

ヒープパネルとは何ですか?なぜその色を設定すると何かが起こるのでしょうか?パネルをフレームに追加したり、コンポーネントを追加したりしていません。

フレームの背景を変更する場合は、コンテンツペインにアクセスする必要があります。コンテンツペインについて説明しているフレームの作成方法に関するSwingチュートリアルを読む必要がある理由をもう一度理解してください。

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

なぜ彼は背景色が表示されないのですか?

于 2013-03-23T00:41:27.163 に答える
2

フレームCENTERのデフォルトの場所に2つのコンポーネントを追加しています。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 に答える