1

Swingsの使用は初めてです

私の要件は、「作成」と「削除」の 2 つのボタンを作成する必要があることです。「作成」ボタンは新しい JTextArea を作成し、「削除」ボタンは選択した JTextarea を削除する必要があります。

「作成」ボタンの作成には成功しましたが、

私の問題は、「選択したJTextAreaを削除する方法は、特定のJTextAreaをクリックして[削除]ボタンを押した場合、クリックしたJTextareaを削除する必要があることを意味します

前もって感謝します

4

1 に答える 1

4

各テキスト領域にアタッチされたある種のフォーカス リスナーを使用する必要があります。基本的に、フォーカス獲得イベントのみに関心があります。

これが発生した場合、フォーカスされたテキスト領域への参照を保存する必要があります。

削除ボタンをクリックすると、以前に保存されたこの参照が使用され、単純にその親から削除されます。たとえば、

if (selectedTextArea != null) {
    selectedTextArea.getParent().remove(selectedTextArea);
}

詳細については、フォーカス リスナーの作成方法を参照してください。

アップデート

コメントで指摘されているrevalidateように、コンテナ/レイアウトを更新できるように呼び出す必要があり、その後にrepaint

例で更新

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestRemover {

    public static void main(String[] args) {
        new TestRemover();
    }

    public TestRemover() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JTextArea lastFocused;
        private FocusHandler focusHandler;
        private JPanel fields;
        private JPanel buttons;

        public TestPane() {
            setLayout(new BorderLayout());
            focusHandler = new FocusHandler();
            fields = new JPanel(new GridBagLayout());
            buttons = new JPanel();
            JButton add = new JButton("Add");
            JButton remove = new JButton("Remove");
            buttons.add(add);
            buttons.add(remove);
            add(buttons, BorderLayout.SOUTH);
            add(new JScrollPane(fields));

            add.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    JTextArea ta = new JTextArea(10, 10);
                    GridBagConstraints gbc = new GridBagConstraints();
                    gbc.fill = GridBagConstraints.HORIZONTAL;
                    gbc.weightx = 1;
                    gbc.gridwidth = GridBagConstraints.REMAINDER;
                    fields.add(new JScrollPane(ta), gbc);
                    ta.addFocusListener(focusHandler);

                    fields.revalidate();
                    fields.repaint();
                }
            });
            remove.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (lastFocused != null) {

                        // ViewPort.ScrollPane
                        Container scollPane = lastFocused.getParent().getParent();
                        Container parent = scollPane.getParent();
                        parent.remove(scollPane);
                        lastFocused = null;
                        parent.revalidate();
                        parent.repaint();

                    }
                }
            });
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        public class FocusHandler extends FocusAdapter {

            @Override
            public void focusGained(FocusEvent e) {
                if (e.getComponent() instanceof JTextArea) {

                    lastFocused = (JTextArea) e.getComponent();

                }
            }                
        }            
    }        
}
于 2013-06-29T07:47:06.417 に答える