1

渡される文字列パラメーターに応じて再利用できる JScrollPane コンポーネントを作成しようとしています。次のコードを作成しました。JFrame を使用して JScrollPane を内部に埋め込むと機能しますが、再利用しようとすると別の JScrollPane を作成するコードで scrollPane がまったく表示されない..Java スイング プロジェクトで実装しています..これで何をすべきか教えてください..どんな提案でも大歓迎です。

JComboBoxに関して私が抱えている同じ問題、それは表示されません...

public class ListComponent extends JScrollPane {

    private String[] selectedNames;
    private String[] listNames;
    private JButton submit, reset;
    private JPanel subPanel = new JPanel();
    private JList list;
    private JScrollPane scroll;

    public String getFirstSelectionInList() {
        return selectedNames[0];
    }

    ListComponent() {

        /*submit = new JButton("Submit");
        reset = new JButton("Reset");*/
        subPanel.setLayout(new FlowLayout());
        /*subPanel.add(submit);
        subPanel.add(reset);*/
    }

    ListComponent(String[] listNames) {
        this();
        /*JFrame frame = new JFrame("Creating a JList Component");*/

        this.listNames = new String[listNames.length];
        this.listNames = listNames;
        //this.setLayout(new BorderLayout());
        //this.setLayout(new ScrollPaneLayout());
        JPanel panel = new JPanel();
        list = new JList(listNames);
        scroll = new JScrollPane(list);
        scroll.setVerticalScrollBarPolicy(
            JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        /*panel.add(scroll);
        panel.add(subPanel,BorderLayout.SOUTH);*/

        /*frame.add(panel);
        frame.pack();
        frame.setVisible(true);*/

        this.setVisible(true);
        list.addListSelectionListener(listSelectionListener);
    }

    ListSelectionListener listSelectionListener = new ListSelectionListener() {

        public void valueChanged(ListSelectionEvent listSelectionEvent) {

            boolean adjust = listSelectionEvent.getValueIsAdjusting();
            //System.out.println(", Adjusting? " + adjust);
            if (!adjust) {
                JList list = (JList) listSelectionEvent.getSource();
                int selections[] = list.getSelectedIndices();
                Object selectionValues[] = list.getSelectedValues();
                int n = selections.length;
                selectedNames = new String[n];
                for (int i = 0; i < n; i++) {
                    if (i == 0) {
                        System.out.print("  Selections: ");
                    }
                    selectedNames[i] = (String) selectionValues[i];
                    System.out.print(selectedNames[i]
                        + "/" + selectionValues[i]);
                }
            }
        }
    };

    /** @return the selectedNames */
    public String[] getSelectedNames() {
        return selectedNames;
    }

    /** @param selectedNames the selectedNames to set */
    public void setSelectedNames(String[] selectedNames) {
        this.selectedNames = selectedNames;
    }

    public static void main(String args[]) {
        String subject[] = {"Math", "Computer", "Phisics", "Chemestry"};
        new ListComponent(subject);
    }
}
4

2 に答える 2

4

@camickr は正しいです。JPanelは、より優れた「軽量コンポーネント用の汎用コンテナー」です。以下の例で使用されている の他の領域にコンポーネントを追加できBorderLayoutます。イベント ディスパッチ スレッドで GUI を構築することも良い習慣です。

import java.awt.*;
import java.util.Arrays;
import javax.swing.*;
import javax.swing.event.*;

/** @see http://stackoverflow.com/questions/4176343 */
public class ListPanel extends JPanel {

    private JList list;

    public ListPanel(String[] data) {
        super(new BorderLayout());
        list = new JList(data);
        list.addListSelectionListener(new SelectionHandler());
        JScrollPane jsp = new JScrollPane(list);
        this.add(jsp, BorderLayout.CENTER);
    }

    private class SelectionHandler implements ListSelectionListener {

        @Override
        public void valueChanged(ListSelectionEvent e) {
            if (!e.getValueIsAdjusting()) {
                System.out.println(Arrays.toString(list.getSelectedValues()));
            }
        }
    }

    private void display() {
        JFrame f = new JFrame("ListPanel");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                String[] data = {"Math", "Computer", "Physics", "Chemistry"};
                new ListPanel(data).display();
            }
        });
    }
}
于 2010-11-14T11:29:04.133 に答える
1

public class ListComponent は JScrollPane を拡張します

何?JScrollPane を拡張するべきではありません。スクロール ペインに新しい機能を追加していません。

JList を JScrollPane に追加しようとしている場合は、JList API を読み、「リストの使用方法」に関する Swing チュートリアルへのリンクに従って作業例を確認することをお勧めします。

于 2010-11-14T05:52:48.907 に答える