2

次のコードを使用して、JPanel に JTextArea を追加しています。

commentTextArea.setLineWrap(true);
commentTextArea.setWrapStyleWord(true);
commentTextArea.setVisible(true);
this.add(commentTextArea);
commentTextArea.setBounds(0, 0, 100, 100);
//commentTextArea.setLocation(0, 0);

setLocation(0,0) を使用するたびに、JTextArea は移動しません。(0,0) ではなく、常に画面の上部中央にあります。同じことが setBounds(0,0,100,100) にも当てはまりますが、高さと幅はこのように設定され、場所だけではありません。どうしてこれなの?

完全なコード

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class UMLEditor {

    public static void main(String[] args) {
        JFrame frame = new UMLWindow();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(30, 30, 1000, 700);
        frame.getContentPane().setBackground(Color.white);
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

class UMLWindow extends JFrame {
    Canvas canvas = new Canvas();

    private static final long serialVersionUID = 1L;

    public UMLWindow() {
        addMenus();
    }

    public void addMenus() {

        getContentPane().add(canvas);

        JMenuBar menubar = new JMenuBar();

        JMenuItem newTextBox = new JMenuItem("New Text Box");
        newTextBox.setMnemonic(KeyEvent.VK_E);
        newTextBox.setToolTipText("Exit application");
        newTextBox.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                canvas.addTextBox();
            }
        });

        menubar.add(newTextBox);

        setJMenuBar(menubar);

        setSize(300, 200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

class Canvas extends JPanel {

    JTextArea commentTextArea = new JTextArea(10, 10);

    public Canvas() {
        this.setOpaque(true);

    }

    public void addTextBox() {

        commentTextArea.setLineWrap(true);
        commentTextArea.setWrapStyleWord(true);
        commentTextArea.setVisible(true);
        commentTextArea.setLocation(0, 0);
        this.add(commentTextArea);
        commentTextArea.setBounds(0, 0, 100, 100);

        revalidate();
        repaint();
    }
}
4

1 に答える 1

7

を介したコンポーネントの位置の設定は、setBounds(...)null レイアウトでのみ機能します。つまり、

container.setLayout(null);` 

しかし、これに関係なく、これを行わないことをお勧めします。これは、あるプラットフォームでは見栄えがよくても、他のほとんどのプラットフォームまたは画面解像度では見栄えが悪く、更新と保守が非常に困難な、非常に柔軟性のない GUI になるためです。代わりに、レイアウト マネージャーを学習して学習し、JPanel をネストして、それぞれ独自のレイアウト マネージャーを使用して、すべての OS で見栄えの良い複雑な GUI を作成する必要があります。

また、JTextArea のサイズを設定することには 2 つ目の隠れた危険があります。これを行うと、JTextArea が常駐する通常の場所である JScrollPane で正しく機能しなくなります。したがって、JTextArea のサイズを決して設定しないようにするために、二重になります。

于 2014-10-27T23:43:01.493 に答える