1

メッセージング GUI

私のプログラムには、なぜそれが起こっているのか理解できないという問題があります。下の入力エリアに何かを入力すると、それを取得して、実際にはテキストエリアボックスである黒い線がある場所に配置する必要があります。editable を false に設定し、ライン ラップを true に設定した場合を除いて、通常は機能し、これが発生し、サイズがパネル全体で画像まで伸びる必要があります。関連するコードを下に置きました。私は何時間も頭を悩ませてきたので、新しい視点が必要です.

private JTextArea message  = new JTextArea(5,20);
private JLabel date = new JLabel();
private ImageIcon img = new ImageIcon(getClass().getResource("/assignment1/img/silhouette.png"));   
private JLabel ImageLabel = new JLabel();



public MessagePanel(String pmessage, Date timestamp) {
    this.setLayout(new GridBagLayout());
    this.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
    this.setPreferredSize(new Dimension(550,150));

    ImageLabel.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
    message.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
    ImageLabel.setIcon(img);

    message.setEditable(false);
    message.append(pmessage);
    message.setLineWrap(true);
    message.setWrapStyleWord(true);
    message.setCaretPosition(message.getDocument().getLength());
    //message.setText(pmessage);
    message.setPreferredSize(new Dimension(400,100));


    SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy hh:mm a");
    date.setText(f.format(timestamp));

    GridBagConstraints messageConst = new GridBagConstraints();
    messageConst.gridx = 0;
    messageConst.gridy = 0;
    messageConst.fill = GridBagConstraints.HORIZONTAL;


    //messageConst.anchor = java.awt.GridBagConstraints.NORTHWEST;
    messageConst.insets = new Insets(12, 83, 0, 0);

    GridBagConstraints iconConst = new GridBagConstraints();
    iconConst.gridx = 1;
    iconConst.gridy = 0;
    iconConst.anchor = java.awt.GridBagConstraints.NORTHWEST;
    iconConst.insets = new Insets(49, 425, 0, 11);

    GridBagConstraints dateConst = new GridBagConstraints();
    dateConst.gridx = 0;
    dateConst.gridy = 1;
    dateConst.gridwidth = 2;
    dateConst.ipadx = 70;
    dateConst.anchor = GridBagConstraints.NORTHWEST;
    dateConst.insets = new Insets(6, 460,0, 11);

    this.add(message,messageConst);
    this.add(date,dateConst);
    this.add(ImageLabel,iconConst);
}
4

1 に答える 1

4

テキスト領域の優先サイズを尊重するdateConst.ipadx = 70;which may effectingの機能を使用する代わりに、代わりに使用してみてください。GridBagLayoutmessageConst.weightx = 1;

この問題はGridBagLayout、テキスト領域の使用可能なスペースを調べて、優先サイズを尊重するのに十分なスペースがないと判断し、代わりに最小サイズ (通常はそれほど大きくない) を使用することに頼る可能性があります。

更新しました

だから私はコードを簡単に試してみて、これを思いつきました...

ここに画像の説明を入力

覚えておくべきことはinsest、特定のセルに重みを加えて大きくすることです。これにより、他のセルが押し出されますが、必ずしも良い方法ではありません。

EASTWESTです、左です ;)

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class TestTextArea100 {

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

    public TestTextArea100() {
        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 message = new JTextArea(5, 20);
        private JLabel date = new JLabel();
        private JLabel ImageLabel = new JLabel();

        public TestPane() {
            this.setLayout(new GridBagLayout());
            this.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
            this.setPreferredSize(new Dimension(550, 150));

            ImageLabel.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
            message.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
            ImageLabel.setText(":)");
            ImageLabel.setBorder(new LineBorder(Color.RED));

            message.setEditable(false);
            message.append("Blah");
            message.setLineWrap(true);
            message.setWrapStyleWord(true);
            message.setCaretPosition(message.getDocument().getLength());
            //message.setText(pmessage);
            message.setPreferredSize(new Dimension(400, 100));

            SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy hh:mm a");
            date.setText(f.format(new Date()));

            GridBagConstraints messageConst = new GridBagConstraints();
            messageConst.gridx = 0;
            messageConst.gridy = 0;
            messageConst.weightx = 1;
            messageConst.weighty = 1;
            messageConst.fill = GridBagConstraints.BOTH;

            messageConst.insets = new Insets(12, 12, 12, 12);

            GridBagConstraints iconConst = new GridBagConstraints();
            iconConst.gridx = 1;
            iconConst.gridy = 0;
            iconConst.insets = new Insets(12, 12, 12, 12);

            GridBagConstraints dateConst = new GridBagConstraints();
            dateConst.gridx = 0;
            dateConst.gridy = 1;
            dateConst.gridwidth = 2;
            dateConst.anchor = GridBagConstraints.EAST;

            this.add(message, messageConst);
            this.add(date, dateConst);
            this.add(ImageLabel, iconConst);
        }
    }

}
于 2013-10-18T06:37:10.087 に答える