Как мне остановить JFrame / JPanel от автоматического форматирования расстояний между моими компонентами? - PullRequest
0 голосов
/ 16 декабря 2018

Итак, я пишу программу, которая использует графический интерфейс.Графический интерфейс построен из JFrame и JPanel на Java.У меня есть JTextArea () и JButton (), который появляется рядом с JTextArea слева.У меня также есть изображение, которое я импортировал локально, используя вызов метода ниже («f» - это имя переменной моего JFrame):

f.setIconImage(ImageIO.read(new File("image.png")));

Я не против разрешить пользователям изменять размер JFrame, но чтоМне не нравится, что JFrame автоматически переформатирует компоненты в моем JFrame - в частности, расстояние между моим изображением и JTextArea ().Я хотел бы, если возможно, сохранить одинаковое расстояние между моим изображением и JTextArea независимо от размера, до которого пользователь изменяет размер JFrame.Вот остальная часть моего кода, если это поможет:

public class GUI {
private JFrame f;
private JPanel p;
private JButton b1;
private JLabel lab;
private JTextArea tf;

private static final String FileName = "schedule.txt";
private static final String FileName2 = "schedule2.txt";

public void show()
{
    f = new JFrame("Scheduler");
    f.setSize(600, 400);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    p = new JPanel();
    //p.setPreferredSize(new Dimension(200, 400));

    b1 = new JButton("Run");

    p.add(b1);

    f.add(p);
    f.add(p, BorderLayout.SOUTH);
    f.add(new JLabel(new ImageIcon("image.png")));
    try {
        f.setIconImage(ImageIO.read(new File("image.png")));
    } catch(Exception z){
        System.out.println("Trouble reading file");
    }

    tf = new JTextArea();
    tf.setPreferredSize(new Dimension(300, 200));

    p.add(tf);

    b1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            String text = tf.getText();
            try {
                FileWriter fw = new FileWriter(FileName);
                fw.write(text);
                fw.close();
                parseInfo();
            }
            catch(Exception ex)
            {

            }
        }
    });
    f.setVisible(true);

}

1 Ответ

0 голосов
/ 17 декабря 2018

Существует множество способов достижения этого, но основной ответ заключается в том, что вам нужно выбрать один или несколько менеджеров компоновки, которые лучше соответствуют вашим потребностям.

Например, используя GridBagLayout, вы можете сделать что-то вроде ...

NormalResized

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.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.LineBorder;

public class JavaApplication1 {

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

    public JavaApplication1() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(8, 8, 8, 8);

            JLabel label = new JLabel("Image placeholder") {
                // This is done only for demonstration purposes
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(128, 128);
                }
            };
            label.setBorder(new LineBorder(Color.DARK_GRAY));

            add(label, gbc);

            gbc.gridy++;
            gbc.fill = GridBagConstraints.BOTH;
            // This will cause the text area to occupy all the avalilable free space
            //gbc.weightx = 1;
            //gbc.weighty = 1;
            JTextArea ta = new JTextArea(10, 20);
            add(new JScrollPane(ta), gbc);

            JButton btn = new JButton("Run");
            gbc.gridy++;
            // Reset the constraints
            gbc.fill = GridBagConstraints.NONE;
            gbc.weightx = 0;
            gbc.weighty = 0;
            add(btn, gbc);
        }

    }
}

Взгляните на Размещение компонентов в контейнере для более подробной информации и идей

Рекомендации ...

В вашем коде есть несколько вещей, которые "выключены", но это ...

tf = new JTextArea();
tf.setPreferredSize(new Dimension(300, 200));

p.add(tf);

, вероятно, самый яркий.

Вообще говоря, JTextArea выиграет от того, что он будет заключен в JScrollPane.Кроме того, из-за несоответствия в том, как текст отображается на нескольких платформах, вы должны избегать использования setPreferredSize (на самом деле, вы должны избегать его использования в целом) и вместо этого полагаться на конструктор rows, columns, который будет делать вычисления на основетекущий шрифт и графические свойства.

...