• ベストアンサー

List,LinkedListの関係

こんにちは。 今、LinkedListでつなげたコンテンツの集合を JListのように表示をしたいと思っています。 もちろん表示しながらもLinkedListの中のそれぞれのコンテンツを変更、削除、挿入などをしてもJListに反映できるようにしたいと思っています。 あるサンプルコードでは //JListを置いたパネル class ListPanel extends JPanel implements ListSelectionListener { JList list; DefaultListModel listModel; int select = -1; //選択された項目インデックス,起動時は-1 String entry; //選択された項目内容 JLabel fileLabel; //ファイル名を表示するラベル ListPanel(){ setLayout(new BorderLayout()); listModel = new DefaultListModel(); list = new JList(listModel); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.addListSelectionListener(this); fileLabel = new JLabel(filename); add(fileLabel, BorderLayout.NORTH); //ファイル名を表示するラベルをJPanelに置く add(new JScrollPane(list), BorderLayout.CENTER); //listを入れたJScrollPaneをJPanelに置く } void dataRead() throws IOException{ //ファイルを読む listModel.removeAllElements(); BufferedReader din = new BufferedReader(new FileReader(filename)); while ((entry=din.readLine()) != null) { //1行読む listModel.addElement(entry); //リスト項目に追加 } din.close(); } のように JList list; DefaultListModel listModel; を使ってやっていますが、LinkedListでも同様にできるのでしょうか? たとえば・・ Jist list list = LinkedList(); といった感じですか?

  • Java
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.3

>というエラーが出たのですが、もう少し詳しく教えていただけないですか? インターフェースをimplementsした場合は、インターフェースに定義されている全てのメソッドを実装しなければなりません。 javax.swing.ListModelは addListDateListener(ListDataListener) getElementAt(int) getSize() removeListDataListener(ListDataListener) の4つのメソッドが定義されているので、これらを全て実装してください。

その他の回答 (2)

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.2

JListで表示するデータとLinkedListで保持するデータを同じにしたいならば、LinkedListにjavax.swing.ListModelインターフェースを実装させたクラスを作れば良いかと思います。 概略的には以下のような感じです。 class Foo extends java.util.LinkedList implements javax.swing.ListModel{中略} java.util.List data = new Foo(); JList list = new JList((ListModel)data);

ilovekoushien
質問者

補足

JListLinked は abstract でなく、javax.swing.ListModel 内の abstract メソッド removeListDataListener(javax.swing.event.ListDataListener) をオーバーライドしません。 class JListLinked extends java.util.LinkedList implements javax.swing.ListModel{ というエラーが出たのですが、 もう少し詳しく教えていただけないですか?

  • deadlock
  • ベストアンサー率67% (59/87)
回答No.1

JList(javax.swing.JList)クラスとList(java.util.List)インターフェースはまったく関係ない型です。 従って、Listの実装クラスであるLinkedList(java.util.LinkedList)クラスもJListクラスとは関係なく、  Jist list  list = LinkedList(); は出来ません。 LinkedListの内容を一つずつJListに登録・追加・削除する必要があります。

ilovekoushien
質問者

お礼

ありがとうございます。 ひとつずつ登録、追加、削除ですか・・ ふぬぬ また新しい次元のことですね。

関連するQ&A

  • 【Java】モーダルDLG内でリストを表示

    Javaを学習し始めて間もない初心者です。よろしくお願いします。 ======================================== 開発環境:Eclipse SDK(Version: 3.5.0) 開発言語:Java ======================================== にて、プログラムを作成しています。 メインDLGの中に配置したボタンを押下したタイミングで、 モーダルDLGを開き、そのDLG内にリストを表示させたいのですが、 参考サイトなどを見ながら、とりあえずモーダルDLGは表示されましたが、 リストが表示されません。 下記に作成ソースを記載しますので、解決法をご存知の方おられましたら、 どこが悪く、どう修正すれば良いかについて、ご教示お願い致します。 なお、当方学習中の身ですので、より良いコードを書くために、 その他の指摘などももしあれば幸いです。 【ソースコード】 import javax.swing.*; import java.awt.BorderLayout; import java.awt.Dialog; import java.awt.Frame; import java.awt.event.*; import java.awt.*; public class TestList extends JFrame implements ActionListener{ Dialog dlg; Frame frm; public static void main(String[] args){ TestList frame = new TestList(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 400, 100); frame.setTitle("リスト表示"); frame.setVisible(true); } TestList(){ { // リスト表示ボタンを追加 JButton btn = new JButton("リストDLGを表示"); btn.addActionListener(this); JPanel p2 = new JPanel(); p2.add(btn); getContentPane().add(p2, BorderLayout.CENTER); } } // ボタン押下イベントを取得する関数 public void actionPerformed(ActionEvent e){ // リスト表示ボタンが押下された時 if (frm == null) { frm = new Frame("リスト"); frm.setSize(200 , 200); frm.setVisible(true); String list_n[] = {"テスト1", "テスト2", "テスト3", "テスト4", "テスト5"}; JList list = new JList(list_n); dlg = new Dialog(frm, "リスト" , true); JScrollPane sp = new JScrollPane(); sp.getViewport().setView(list); sp.setPreferredSize(new Dimension(200, 80)); JPanel p = new JPanel(); p.add(sp); dlg.add(p, BorderLayout.CENTER); } } }

    • ベストアンサー
    • Java
  • パネルの上書きをしたい

    何個のJList等が作成されるか未定で、必要になればその都度JPanelに追加されるというプログラムを考えています。以下のクラスを作成し、呼び出し指定したJPanelに貼り付けることをしました。 2度目の呼び出しは一度目に呼び出して貼り付けられたJList等は不要で表示しないでよいのですが、残したまま追加という形で表示されました。 以前のものが残されているのはJPanelが新しいものではないということがわかりましたのでaddcomを呼び出す前に一度初期化しました。 ですが今度パネルが重なるのか文字が重なる(はっきり重なるわけではなくうっすら文字のようなものが見えます)状態になりました。 表示しているJPanelは別のJPanelのボーダーレイアウトのcenterにその都度貼り付けています。 クラスには問題はないと思われますか? 毎回同じパネルに貼り付ける場合貼り付ける直前に同じ箇所に貼り付けられていたパネルはどうなるのでしょうか?単に貼り付けられなくなるだけなのでしょうか?それとも上から貼り付けられるだけなのでしょうか?いろいろ試していると上から貼り付けられるような気がします。 class addcom{ JPanel addpanel; Vector listaddress; addcom(JPanel addpanel,Vector attribute,Vector listaddress){ this.listaddress = listaddress; this.addpanel = addpanel; } void addList(Vector setattribute){ JList list = new JList(setattribute); addpanel.add(list); listaddress.add(list); } void addLabel(String str,Vector labeladdress){ JLabel label = new JLabel(str); addpanel.add(label); labeladdress.add(label); } void addButton(String str,Vector buttonaddress){ JButton button = new JButton(str); addpanel.add(button); buttonaddress.add(button); } }

    • ベストアンサー
    • Java
  • JAVAの正解・誤解判定の宣言が分かりません

    class ListPanel extends JPanel implements ActionListener{ JButton button1; JList list1; String[] data = {"( A )","( B )" ,"( C )" ,"( D )" }; ListPanel() { button1 = new JButton("選択OK"); button1.addActionListener(this); list1 = new JList(data); list1.setFixedCellWidth(100); JScrollPane scroll1 = new JScrollPane(list1); scroll1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scroll1.setPreferredSize(new Dimension(150,80)); scroll1.setBorder(BorderFactory.createEtchedBorder() ); scroll1.setBorder(BorderFactory.createTitledBorder("選択肢") ); JPanel p1 = new JPanel(); p1.add(scroll1); JPanel p2 = new JPanel(); p2.add(button1); this.add(p1); this.add(p2); } public void actionPerformed(ActionEvent e1) { if (e1.getSource() == button1) { if (list1.getSelectedItem() == ( C ) ) { JOptionPane.showMessageDialog(null, "あなたが選択した解答" , " 正解です!",JOptionPane.INFORMATION_MESSAGE); } else if (list1.getSelectedItem() != ( C ) ){ JOptionPane.showMessageDialog(null, "あなたが選択した解答", "間違いです!解答は( C )です" , JOptionPane.INFORMATION_MESSAGE); list1.getSelectedItem() == ( C ) ) { の宣言が間違っているようです。何卒よろしくお願いいたします。どこが間違っているか指摘していただければ幸いです。どうか、よろしくお願いします。

  • JScrollPaneのオブジェクトは位置位置

    JScrollPaneについて、質問させて頂きます。 JScrollPaneに、JTextAreaを縦一列に配置したJPanelを追加しようとしたのですが、何故かJScrollPaneに配置すると、JPanel内のJTextAreaの配置が横一列になってしまいます。 つまり、現在は TEST1 TEST2 TEST3 TEST4....(JTextAreaを並べたJPanelです) となっているJScrollPaneを Test1 Test2 Test3 Test4 のように表示したいのです。 大学の授業に絡むコードですので全てを貼付けるとネットから拾ってきたのではと思われてしまうため、全ては貼付けられませんがコードの一部を張りつけさせて頂きます。 まずはJScrollPaneの設定ですが private JScrollPane getScroll() { if (scroll == null) { scroll = new JScrollPane(innerHomeTimeLine); scroll.setPreferredSize(new Dimension(width, height)); scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); scroll.setWheelScrollingEnabled(true); } return scroll; } としてJScrollPaneを作成しています、innerHomeTimeLineはJTextAreaを縦一列に並べたJPanelです。 このJScrollPaneを this.add(getScroll(),BorderLayout.NORTH); でJPanelに追加し、そのJPanel(homeTimeLine)をthis.add(homeTimeLine,BorderLayout.CENTER); でJAppletに追加し、表示しています。 JPanel(innerHomeTimeLine)そのものをJAppletに追加すると縦一列に並んだまま表示出来るのは確認しているので、JScrollPaneの設定の問題だと思うのですが、どうすれば良いのでしょうか.... やり方をご存知の方がいましたら、解答して頂けると助かります、宜しくお願いします。 さすがにこのコードだけでは解答は無理、といったことでしたら、必要な部分を教えて頂ければ、抜き出して追記させて頂きます。

    • ベストアンサー
    • Java
  • javaで2パネルにテーブルデーターを表示

    今日は! javaの初心者で、初心者なりに、フレームに2個のパネルを作成し、各パネルに同じ テーブルデーターを表示するコードを作ってみましたが、旨く行きません。 下記の添付コードで、不具合点の改造箇所をお教え頂けますと大変助かります。 //================================== package packageA; import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; public class JTableTest2 extends JFrame{ public static void main(String[] args){ JTableTest2 test = new JTableTest2("JTableTest2"); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); } JTableTest2(String name){ setBounds( 0, 0, 300*2, 140*2); setTitle(name); String data[][] = { //テーブルデータを作る {"田辺太郎","89","79","100","100"}, {"山田大助","68","55","72","100"}, {"佐藤恵美","78","69","81","100"} }; //列名の配列 String title[] = {"名前","数学","英語","国語","音楽"}; JTable table = new JTable(data,title); //テーブルデータと列名でテーブルを作る JPanel p1 = new JPanel(); JPanel p2 = new JPanel(); JScrollPane sp = new JScrollPane(table); sp.setPreferredSize(new Dimension(250, 80)); p1.add(sp); //JPanelにJScrollPaneを結合する p2.add(sp); //JPanelにJScrollPaneを結合する getContentPane().add(p1, BorderLayout.WEST); getContentPane().add(p2, BorderLayout.EAST); } } 以上、宜しくお願いします。

    • ベストアンサー
    • Java
  • Java JPanelを使ったコードについての質問です

    Java JPanelを使ったコードについての質問です 4つのTextFieldに数値を入力し、エンターキーが押されたときに円グラフが表示されるプログラムについての質問です。 下記のコードなのですが、何故かエラーが出てしまいます… public class PieCharts extends JPanel implements ActionListener { private JLabel l1, l2, l3, l4; private JTextField t1, t2, t3, t4; private JButton bt; private JPanel pn1,pn2; int h, m, l, n, w, x, y, z; private DrawOvalPane dop; public static void main(String args[]) { JFrame frame = new JFrame("Applet"); frame.setContentPane(new PieCharts()); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true); } public PieCharts() { dop = new DrawOvalPane(); l1 = new JLabel("High Risk", JLabel.RIGHT); l2 = new JLabel("Medium Risk", JLabel.RIGHT); l3 = new JLabel("Low Risk", JLabel.RIGHT); l4 = new JLabel("No Risk", JLabel.RIGHT); t1 = new JTextField(); t1.addActionListener(this); t2 = new JTextField(); t2.addActionListener(this); t3 = new JTextField(); t3.addActionListener(this); t4 = new JTextField(); t4.addActionListener(this); bt = new JButton("Enter"); pn1 = new JPanel(); pn2 = new JPanel(); pn1.setLayout(new GridLayout(2,4)); pn1.add(l1); pn1.add(t1); pn1.add(l2); pn1.add(t2); pn1.add(l3); pn1.add(t3); pn1.add(l4); pn1.add(t4); pn2.add(bt); setLayout(new BorderLayout()); add("North", pn1); add("Center", dop); add("South", pn2); bt.addActionListener(new SampleActionListener()); }

  • JTextFieldの大きさ

    すべて記述すると長くなるので、必要なところを抜粋したコードです。 JPanel jpnl1 = new JPanel(new GridLayout(1, 2)); JLabel jlbl = new JLabel("文字列"); JTextField jtf = new JTextField(); Container cont = getContentPane(); jpnl1.setPreferredSize(new Dimension(20, 15)); jpnl1.add(jlbl); jpnl2.add(jtf); cont.add(jpnl1, BorderLayout.CENTER); これで実行(別クラスから呼び出し)すると、JTextFieldの大きさが不必要に大きくなってしまいます(6行目の設定が効かない)。 JTextFieldを自分の思ったようなサイズにすることはできないのでしょうか? 親クラス・・・JFrame 別クラスからは、setBounds(100, 100, 300, 130)として呼び出しています(setVisible(ture)) 環境・・・WindowXP、JDK1.5.09 JRE1.5.09

    • ベストアンサー
    • Java
  • finalの意味

    import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ExerciseD8L1{ public static void main(String args[]){ final JFrame myFrame = new JFrame(); myFrame.getContentPane().setLayout(new BorderLayout()); final JLabel myLabel = new JLabel(); JPanel myPanel = new JPanel(); myFrame.getContentPane().add(myLabel,BorderLayout.CENTER); myFrame.getContentPane().add(myPanel,BorderLayout.NORTH); JButton btn1 = new JButton("btn1"); btn1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ myLabel.setText("btn1がクリックされました"); } }); }); myPanel.add(btn1); myFrame.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); myFrame.setSize(400,100); myFrame.setVisible(true); } } これで、finalをつけないとコンパイルできません。 なぜ、fianlが必要なんでしょう。 どのようなときにfinalを用いるのでしょう。 お願いします。

    • ベストアンサー
    • Java
  • JAVAでの背景画像表示

    現在javaでゲームのメニュー画面を作っているのですが、ボタンを配置する所まではできたんですが、背景に画像を表示することができなくて困っています! import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.border.LineBorder; import javax.swing.border.EtchedBorder; import java.awt.Color; import java.awt.Container; public class Mati extends JFrame{ public static void main(String[] args){ Mati frame = new Mati(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10,650,650); frame.setTitle("街"); frame.setVisible(true); JPanel h = new JPanel(); h.setOpaque(false); ImageIcon icon1 = new ImageIcon("Mati.jpg"); JLabel label1 = new JLabel(icon1); JLabel label2 = new JLabel(); h.add(label1); } Mati(){ JButton button1 = new JButton("宿屋"); button1.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button2 = new JButton("道具屋"); button2.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button3 = new JButton("武器屋"); button3.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button4 = new JButton("街を出る"); button4.setFont(new Font("Mairyo", Font.PLAIN, 30)); JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); p.add(Box.createRigidArea(new Dimension(10,30))); p.add(button1); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button2); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button3); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button4); getContentPane().add(p, BorderLayout.CENTER); } } ソースはこのようになっています。これからどうすれば背景画像が表示されるか教えていただきたいです。 よろしくお願いします。

  • javaでスタート画面を作っていて困っています。

    現在javaでゲームのスタート画面を作っているのですが、パネルが透過されずに困っています。 プログラムソースは import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.*; import java.awt.Font; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.*; import java.awt.event.*; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.border.LineBorder; import javax.swing.border.EtchedBorder; import java.awt.Color; import java.awt.Container; class Start最新版 extends JFrame{ public static void main(String args[]){ Start最新版 frame = new Start最新版("タイトル"); frame.setVisible(true); } Start最新版(String title){ setTitle(title); setBounds(10, 10, 1024, 768); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); p.setOpaque( false ); ImageIcon icon1 = new ImageIcon("Start.jpg"); JLabel label1 = new JLabel(icon1); JLabel label2 = new JLabel(); p.add(label1); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); JButton button1 = new JButton("ゲームを始める"); button1.setFont(new Font("Mairyo", Font.PLAIN, 30)); JPanel n = new JPanel(); n.setOpaque(false); n.setLayout(new BoxLayout(n, BoxLayout.Y_AXIS)); n.add(Box.createRigidArea(new Dimension(290,30))); n.add(button1); となっています。「ゲームを始める」ボタンだけを残して、周りのパネルを透過して画像を表示させたいのですが、うまくいきません!解決方法をご存知の方どうか教えていただきたいです!よろしくお願いします。