0

JTabbed Panes を使用してプログラムを作成しています。JTextField からテキストを取得し、そのテキストを使用して新しいタブを作成するボタンが必要です。新しいタブには名前 = Jtextfield.getText() が含まれ、JTextArea に 10 回出力されます。

私の本当の質問は、ボタンの ActionListener にデータを渡す方法、または問題を引き起こしているため、それをどのように回避するかです。

アップデート:

これを解決するための私の試みは次のとおりです。私はコードが複雑であることを知っています。私は恐ろしいプログラマーです。ここで何が問題なのかを理解するのを手伝ってくれることを願っています。私の CreateComponent メソッドと CreateNewFeedBlock actionListener が間違っているのではないかと心配しています。

これが私のコードの一部です。ご容赦ください。

private static JPanel mainPane;    
private JPanel categoryPanel; 
private JTextField categoryName;
private JPanel panel1;
private JTextField title1;
private JTextField url1;
private JPanel panel2;
private JTextField title2;
private JTextField url2;
private JPanel panel3;
private JTextField title3;
private JTextField url3;
private JPanel panel4;
private JTextField title4;
private JTextField url4;

public BIS() 
{
//unecessary code
categoryPanel = new JPanel();
categoryPanel.setLayout(new GridLayout(2,2));
JLabel emptyLabel1 = new JLabel("");
JLabel emptyLabel2 = new JLabel("");
JLabel insertCategoryName = new JLabel("Category name:");
categoryName = new JTextField(20);

panel1 = new JPanel();
panel1.setLayout(new GridLayout(2,2));
JLabel insertTitle1 = new JLabel("Feed Title:");
title1 = new JTextField(20);
JLabel insertURL1 = new JLabel("URL:");
url1 = new JTextField(20);
panel1.add(insertTitle1);
panel1.add(title1);
panel1.add(insertURL1);
panel1.add(url1);




categoryPanel.add(emptyLabel1);
categoryPanel.add(emptyLabel2);
categoryPanel.add(insertCategoryName);
categoryPanel.add(categoryName);

JPanel addPanel = new JPanel(new GridLayout(6,1));
JButton addButton = new JButton("Create Your RSS Show");

addPanel.add(categoryPanel);
addPanel.add(panel1);
addPanel.add(addButton);
addPanel.setBorder(BorderFactory.createEmptyBorder(64, 64, 64, 64));

addButton.addActionListener(new CreateTab());

pane.add("Create Your Own", addPanel);

Timer timer = new Timer(15000, new ActionListener()
{

public void actionPerformed(ActionEvent e)
{
allRun();
//System.out.println("U BO NIHER");
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
timer.restart();
}


public class CreateTab implements ActionListener
{
public void actionPerformed(ActionEvent e)
{

panel = new JPanel();
while (!url1.getText().contains("http://"))
{
JOptionPane.showMessageDialog(panel, "The RSS Feed Link does not contain http//.");
url1.setText(JOptionPane.showInputDialog("Please enter the full URL to the RSS Feed?"));
}


rssListForTab = new ArrayList<rssInfo>();

rssInfo feedInfo = new rssInfo(title1.getText(), url1.getText());

rssListForTab.add(feedInfo);
rssListForAll.add(rssListForTab);

final Component newTab = createComponent(panel, rssListForTab);
pane.add(categoryName.getText(), newTab);


// newTab.get
// newTab.getComponent(2);

categoryName.setText("");
title1.setText("");
url1.setText("");

}
}

private JComponent createComponent(JPanel panel, ArrayList<rssInfo> rssList)
{
JLabel t1 = new JLabel(title1.getText(), JLabel.CENTER);
JTextArea u1 = new JTextArea(5,5);
JScrollPane u1Scroll = new JScrollPane(u1);
u1Scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
u1Scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
u1.setEditable(false);
u1.setFont(new Font("Tahoma", Font.BOLD, 12));
u1.setLineWrap(true);
u1.setWrapStyleWord(true);

JButton addFeedButton = new JButton("Add Feed");
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));

panel.add(addFeedButton);
panel.add(t1);
panel.add(u1Scroll);
panel.setSize(1,1);
panel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6));

addFeedButton.addActionListener(new createNewFeedBlock());
return panel;
}

public class createNewFeedBlock implements ActionListener  
{
public void actionPerformed(ActionEvent e)
{
rssInfo newFeedInfo = DisplayDialog();

JLabel t2 = new JLabel(newFeedInfo.getTitle(), JLabel.CENTER);
JTextArea u2 = new JTextArea(5,5);
JScrollPane u2Scroll = new JScrollPane(u2);  
u2Scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
u2Scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
u2.setEditable(false);
u2.setFont(new Font("Tahoma", Font.BOLD, 12));   
u2.setLineWrap(true);
u2.setWrapStyleWord(true);

rssListForTab.add(newFeedInfo);

panel.add(t2);
panel.add(u2Scroll);

}
}

問題は CreateNewFeedBlock および/または createComponent メソッド内にあると思います。このコードが非常に読みにくいことは承知していますが、何が問題なのかを見つけるために何らかの形で助けていただけるかどうかを確認してください。

あなたが間違っていると思うものを見て、私に言ってください、私はこれを解決するために最善を尽くしていますが、私は無力です. あなたの助けが私をこの挑戦に導いてくれることを願っています。

アップデート**

このコードは正しく機能しません。addFeedButton をクリックすると、呼び出し元の対応するタブに 1 つのフィードが追加されるのではなく、ペイン内のすべてのタブに 1 つのフィードが追加されます。

私はそれが可変スコープの問題であると確信しています。誰かがそれを回避する方法を見つけるのを手伝ってくれますか? ありがとうございました!

4

1 に答える 1

0

Click-Action が呼び出されると、ActionListener は、ActionEvent-Object の一部として渡された原因オブジェクトへの参照を取得します。したがって、イベント処理関数では、たとえば次のように使用できます。

public void actionPerformed(ActionEvent e) { 
    JButton sourceButton = (JButton)e.getSource();
}

関数内から TextField を参照する場合は、直接アドレス指定するか (actionHandler が Objects と同じクラス内で定義されている場合は簡単です)、への参照を含む独自のカスタム ボタンクラスを作成します。テキストフィールド (アクションハンドラーが個別に/親クラスで定義されている場合に役立ちます) 例:

class MyTabButton extends JButton{
   private JTextField tabTextField;
   public MyTabButton(JTextField text){
      tabTextField = text;
   }
   public JTextField getTabTextField(){
      return tabTextField;
   }
   //... someOtherStuff
}

次に、actionHandlerでそれを取得します

public void actionPerformed(ActionEvent e) { 
    MyTabButton sourceButton = (MyTabButton)e.getSource();
    String text = sourceButton.gettabTextField().getText();
}
于 2012-12-02T12:30:24.277 に答える