3

簡単な Java アプリケーションを作成しました。3 つの要素を含む 1 つのウィンドウ (JFrame ramka): JButton、JComboBox、およびコンテナー (JList を含む)。これらの要素の位置を再配置したいのですが、問題が発生します。GridBagLayout を使用したいのですが、これを行うと、コンテナーが消えます (または 1 ピクセルの大きさになります -.-)。setSize も JComboBox で正常に機能します。また、レイアウトを使用しない場合、JList を含むコンテナーが表示されますが、JComboBox のサイズ変更が機能せず、すべてがオーバーラップしています...一般的には、次のように見えます..まったく見えません。

ここに私の質問があります: コンポーネントと JFrame の位置を再編成するために、どのように、どのレイアウトを使用しますか? NetBeans 7.2 を使用しています

package layouttest;

import java.awt.*;
import javax.swing.*;
import javax.swing.JList;
import java.util.ArrayList;
import java.awt.*;
import java.awt.GridBagLayout;
import java.awt.event.*;
import javax.swing.*;

public class Layouttest {
    public static void main(String[] args) {
        JFrame ramka = new JFrame();
        //ramka.setLayout(new GridLayout(4, 3));
        //ramka.setLayout(new GridBagLayout());
        String [] test = {"cos", "cos2", "cos3", "cos4", "cos5", "cos6", "cos7", "cos8", "cos9","cos10", "cos11", "cos12"};
        ArrayList<String> myList = new ArrayList<String>();
        myList.add("cos");
        myList.add("cos2");
        myList.add("cos3");
        myList.add("cos4");
        myList.add("cos5");
        myList.add("cos6");
        myList.add("cos7");
        myList.add("cos8");
        myList.add("cos9");
        myList.add("cos10");

        GridBagConstraints ogranicznik = new GridBagConstraints();
        ogranicznik.insets = new Insets(5, 10, 5, 5);
        ogranicznik.gridx = 0;
        ogranicznik.gridy = 0; 

        Container c = new Container();
        ramka.setSize(500, 500);
        c.setSize(100,100);

        JList lista = new JList(myList.toArray());
        JScrollPane sp = new JScrollPane(lista);
        JTextField txt = new JTextField("cos");
        c.add(sp);

        sp.setSize(100,100);
        lista.setSize(100, 100);
        ramka.add(c);
        ramka.add(txt);

        String[] dropBoxList = {"uno", "due", "tre"};
        final JComboBox listaRozwijalna = new JComboBox(dropBoxList);

        listaRozwijalna.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXX"); 
        listaRozwijalna.revalidate();
        listaRozwijalna.repaint();
        ramka.add(listaRozwijalna);

        c.revalidate();
        c.repaint();
        ramka.revalidate();
        ramka.setVisible(true);
        ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // TODO code application logic here
    }
}

@EDIT私は、レイアウトモデルの使用中にJavaがコンテナを表示する際に問題があることを発見しました...

4

2 に答える 2

1

コードを再配置し、GridBagLayout に追加しました。コンポーネントをどのように配置したいかを推測する必要がありました。

  1. Swing コンポーネントが Event Dispatch スレッド上にあることを常に確認してください。それが main メソッドの機能です。

  2. GUI コンポーネントをデータ定義から分離します。これにより、GUI コンポーネントの検証が容易になります。

  3. メイン JPanel に配置されている順序で GUI コンポーネントを定義します。

  4. 常にメイン JPanel を定義します。これにより、GUI を定義するために使用するレイアウト マネージャーの柔軟性が向上します。

  5. 常に 1 つ以上のレイアウト マネージャーを使用してください。

これがあなたのコードの私のバージョンです。

import java.awt.Component;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Layouttest implements Runnable {

    protected Insets    ogranicznik = new Insets(5, 10, 5, 5);

    @Override
    public void run() {
        JFrame ramka = new JFrame();

        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());

        JTextField txt = new JTextField("cos");

        addComponent(panel, txt, 0, 0, 1, 1, ogranicznik,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        JComboBox listaRozwijalna = new JComboBox(setDropBoxValues());

        addComponent(panel, listaRozwijalna, 1, 0, 1, 1, ogranicznik,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        JList lista = new JList(setListValues());
        JScrollPane sp = new JScrollPane(lista);

        addComponent(panel, sp, 0, 1, 1, 1, ogranicznik,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        ramka.add(panel);
        ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // ramka.setSize(500, 500);
        ramka.pack();
        ramka.setVisible(true);
    }

    protected void addComponent(Container container, Component component,
            int gridx, int gridy, int gridwidth, int gridheight, Insets insets,
            int anchor, int fill) {
        GridBagConstraints gbc = new GridBagConstraints(gridx, gridy,
                gridwidth, gridheight, 1.0D, 1.0D, anchor, fill, insets, 0, 0);
        container.add(component, gbc);
    }

    protected String[] setListValues() {
        String[] test = { "cos", "cos2", "cos3", "cos4", "cos5", "cos6",
                "cos7", "cos8", "cos9", "cos10", "cos11", "cos12" };
        return test;
    }

    protected String[] setDropBoxValues() {
        String[] dropBoxList = { "uno", "due", "tre" };
        return dropBoxList;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Layouttest());
    }
}
于 2012-12-27T16:37:40.657 に答える
0

私はまったく別の方法でそれを行いました...コンテナを省略しただけです...

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package layouttest;

import java.awt.*;
import javax.swing.*;
import javax.swing.JList;
import java.util.ArrayList;
import java.awt.*;
import java.awt.GridBagLayout;
import java.awt.event.*;
import javax.swing.*;


/**
 *
 * @author kula
 */
public class Layouttest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        JFrame ramka = new JFrame();
       //ramka.setLayout(new GridLayout(4, 3));
        ramka.setLayout(new GridBagLayout());
        String [] test = {"cos", "cos2", "cos3", "cos4", "cos5", "cos6", "cos7", "cos8", "cos9","cos10", "cos11", "cos12"};
        ArrayList<String> myList = new ArrayList<String>();
        myList.add("cos");
        myList.add("cos2");
        myList.add("cos3");
        myList.add("cos4");
        myList.add("cos5");
        myList.add("cos6");
        myList.add("cos7");
        myList.add("cos8");
        myList.add("cos9");
        myList.add("cos10");

        GridBagConstraints ogranicznik = new GridBagConstraints();
//ogranicznik.insets = new Insets(5, 10, 5, 5);
ogranicznik.gridx = 0;
ogranicznik.gridy = 2; 

        Container c = new Container();
        ramka.setSize(500, 500);
   // c.setSize(100,100);

    final JScrollPane sp = new JScrollPane();
    JList lista = new JList(myList.toArray());

   sp.getViewport().add(lista);//!!!!!!!!!!!!!!!!!!

    //sp.removeAll();

    //c.add(sp);
   //sp.setViewportView(lista);
  // sp.setSize(100,100);
   //lista.setSize(100, 100);
    ramka.add(sp);




    String[] dropBoxList = {"uno", "due", "tre"};
    final JComboBox listaRozwijalna = new JComboBox(dropBoxList);


   /* listaRozwijalna.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXX"); 
    listaRozwijalna.revalidate();
    listaRozwijalna.repaint();*/
   // ramka.add(listaRozwijalna);


    c.revalidate();
    c.repaint();
    ramka.revalidate();


    ramka.setVisible(true);
    ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // TODO code application logic here
    }
}
于 2012-12-27T19:53:22.870 に答える