2016-11-28 5 views
-1

EDIT:コードを更新しましたが、今度はdrawStringを上書きします。文字列をリストに表示する方法は?

テキストフィールドで何かを言うたびに、drawStringからの入力を15px低く表示することはできません。あなたが入力したすべての文字列をeatchotherの下に表示するにはどうすればよいですか?

(JAVAに新しいイム)事前のおかげで...あなたのpaintComponent(Graphics g)メソッド内

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

public class paneel extends JPanel { 
private static final long serialVersionUID = 1L; 
private JTextField invoer; 
private JButton knop; 
//private String item1; 
private item item; 
int y = 50; 

public paneel() { 
    setLayout(null); 

    item = new item(); 
    //item1 = ""; 
    item.setItem(""); 

    invoer = new JTextField(10); 
    invoer.setBounds(50, 25, 150, 20); 

    knop = new JButton("Voeg toe"); 
    knop.addActionListener(new invoerVakHandler()); 
    knop.setBounds(225, 25, 125, 20); 

    add(invoer);  add(knop); 
} 

class invoerVakHandler implements ActionListener { 
    public void actionPerformed (ActionEvent e) { 
     String item1 = invoer.getText(); 

     invoer.setText(""); 

     item.setItem(item1); 

     repaint(); 
    } 
} 

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Font font = new Font("Verdana", Font.BOLD, 15); 
    g.setFont(font); 

    y += 35; 

    g.setColor(Color.BLACK); 
    g.drawRect(50, 75, 300, 400); 

    g.drawString(String.format("- %s", item.getItem()), 100, y); 
} 
} 
+0

あなたの 'y'がローカル変数であるため、' y - = 15'はむしろ奇妙です。詳細は 'y'のインスタンス変数が必要です。https://www.cs.umd .edu /〜clin/MoreJava/Objects/local.html(例えば) –

+0

あなたはテスト可能なサンプルを投稿できますか? –

+1

* "リストに文字列を表示する方法" * ['DefaultListModel']で' JList'を使用する(http://docs.oracle.com/javase/8/docs/api/javax/swing/ DefaultListModel.html)。適切なレイアウト/制約を持つ 'JPanel'の' JScrollPane'にリストを表示します。新しい 'String'を追加する場合は、' DefaultListModel.addElement(Object) 'を呼び出します。カスタムペイントよりも簡単で、はるかに堅牢です。脇の下として:より良い助けを早く得るために、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 @FastSnail * "testable example" *コメント内の '[mcve]'は[mcve]に自動的に展開されます。 –

答えて

1

は、あなたが現在ローカル変数の代わりに、yのクラスインスタンス変数を使用しています。現在の実装では、毎回paintComponentが呼び出され、新しいローカル変数yが作成され(paintComponentが完了すると削除されます)、変数が120に設定されるたびに、すべての文字列に対して135pxで描画されます。

変数をメモリ内に残すために、yをインスタンス変数に変更する必要があります。

ちょうどpublic class paneel {の下に、yの定義を追加します。したがって、paneelのインスタンス内のすべてのメソッドで使用できます。

だから、スニペットのサンプルコードは次のようになります。

public class paneel { 
    int y = 120; 
... 
... 

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    //adding 15 to the instance of y. 
    //Since y is defined as a class member, and not a local variable, the update to y will remain in memory. 
    y += 15; 

    g.setColor(Color.BLACK); 
    g.drawRect(50, 75, 300, 400); 

    g.drawString(String.format("- %s", item.getItem()), 100, y); 
} 
0

どのように私はあなたが下にeatchother表示するために入力し、すべての文字列を得ることができますか?

paintComponent(...)メソッドが呼び出されるたびにStringのすべてを再ペイントする必要があります。

これは、ペイントしたいすべての文字列のArrayListを保持する必要があることを意味します。次に、paintComponent(...)メソッドでListを繰り返し、各文字列にペイントします。

チェックアウトCustom Painting ApproachesDrawOnComponentの例には、このアプローチの実例が含まれています。この例では四角形をペイントしていますが、コンセプトはStringで同じです。

関連する問題