1

私は Java Swing でコーディングしていますが、何らかの理由で、2 つの要素をグリッドレイアウトに追加すると、両方とも同じ位置になります。失敗しないものに単純化し、そこから構築しようとしましたが、残念ながら、まだ機能していません。

プログラム内の不正なコードは次のとおりです。

        bodyPanelMain.setLayout(new GridLayout(4, 1, 10, 10));
        JTextArea one = new JTextArea("Hi");
        one.setLineWrap(true);
        one.setSize(100, 100);
        JTextArea two = new JTextArea("Goodbye");
        two.setLineWrap(true);
        two.setSize(100, 100);
        bodyPanelMain.add(one);
        bodyPanelMain.add(two);
        bodyPanelMain.repaint();

JTextArea の幅を 200 にして背景を別の色にすると、その背後に見えることは明らかなので、適切な要素がすべて追加されていることは間違いありません。それらの位置が間違っているだけです。

編集:これは、私がやろうとしていることの非常に短いバージョンです。

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class minimessageboard extends Applet implements ActionListener {

JPanel mainPanel;
JPanel buttonPanel;
JButton announcements, websites;
JPanel bodyPanel, bodyPanelMain;

public minimessageboard() {
    this.setSize(600, 400);

    mainPanel = new JPanel(new BorderLayout());
    mainPanel.setPreferredSize(new Dimension(this.getWidth(), this.getHeight()));
    this.add(mainPanel);

    buttonPanel = new JPanel(new GridLayout(6, 1, 10, 10));
    mainPanel.add(buttonPanel, BorderLayout.WEST);

    announcements = new JButton("Announcements");
    this.formatButton(announcements);
    announcements.setActionCommand("announcements");
    buttonPanel.add(announcements);

    websites = new JButton("Websites");
    this.formatButton(websites);
    websites.setActionCommand("websites");
    buttonPanel.add(websites);

    bodyPanel = new JPanel(new BorderLayout());
    bodyPanel.setSize(200, 500);
    bodyPanel.setPreferredSize(new Dimension(200, 500));
    mainPanel.add(bodyPanel, BorderLayout.CENTER);

    bodyPanelMain = new JPanel(new BorderLayout());
    bodyPanel.add(bodyPanelMain, BorderLayout.CENTER);
    bodyPanelMain.setLayout(new GridLayout(4, 1, 10, 10));
    JButton one = new JButton("Roar");
    bodyPanelMain.add(one);
    bodyPanelMain.revalidate();
    bodyPanelMain.repaint();
}

public static void main(String args[]) {
    JFrame overall = new JFrame(); 
    overall.pack();
    overall.setVisible(true);
    overall.add(new minimessageboard());
}

public void formatButton(JButton b){
    b.setPreferredSize(new Dimension(150, 33));
    b.addActionListener(this);
}

public void actionPerformed(ActionEvent arg0) {
    String action = arg0.getActionCommand();
    bodyPanelMain.removeAll();
    if (action.equals("websites")){
        System.out.println("Fires!");
        bodyPanelMain.setLayout(new GridLayout(4, 1, 10, 10));
        JButton one = new JButton("Hi");
        JButton two = new JButton("Goodbye");
        bodyPanelMain.add(one);
        bodyPanelMain.add(two);
        bodyPanelMain.revalidate();
    }
    bodyPanelMain.repaint();
}
}

基本的に、ウェブサイトをクリックすると、「こんにちは」と「さようなら」が表示されます。Web サイトの if ステートメント (if (action.equals("websites")) 内のブロック内のコードを元のコンストラクターまで移動すると、完全に問題ないように見えます。コードは「Fires!」を出力するので、100% 確実です。注意点として、JTextArea ではなく JButton を使用するため、JTextArea から JButton に変更しました。

4

1 に答える 1

3

JTextArea のサイズを設定しないでください。テキストがテキスト領域のサイズを超えて拡張され、スクロールされない場合はうまく機能しません。代わりに、優先する行と列の値を設定してから、JTextArea 自体のサイズを設定します。あなたの問題について: GUI がレンダリングされた後にこれらのコンポーネントを追加していますか? もしそうなら、bodyPanelMain が JTextAreas を受け取った後に revalidate() を呼び出しますか? これで解決しない場合は、sscce を作成して投稿することを検討してください。

たとえば、これは私にとってはうまくいきます:

import java.awt.GridLayout;
import javax.swing.*;

public class SwingFoo {
   private static final int ROWS = 10;
   private static final int COLS = 16;

   private static void createAndShowGui() {
      JPanel bodyPanelMain = new JPanel();
      bodyPanelMain.setLayout(new GridLayout(4, 1, 10, 10));
      JTextArea one = new JTextArea("Hi", ROWS, COLS);
      one.setLineWrap(true);
      // one.setSize(100, 100);
      JTextArea two = new JTextArea("Goodbye", ROWS, COLS);
      two.setLineWrap(true);
      // two.setSize(100, 100);
      bodyPanelMain.add(new JScrollPane(one));
      bodyPanelMain.add(new JScrollPane(two));
      // bodyPanelMain.repaint();

      JFrame frame = new JFrame("SwingFoo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(bodyPanelMain);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
于 2012-04-07T15:38:23.470 に答える