所以我正在写一个利用GUI的程序。 GUI是用Java中的JFrame和JPanel构建的。我有一个JTextArea()和一个JButton(),它出现在左侧的JTextArea旁边。我也有一个图像,该图像是使用以下方法调用在本地导入的(“ f”是我的JFrame的变量名):
f.setIconImage(ImageIO.read(new File("image.png")));
我不介意允许用户调整JFrame的大小,但是我不喜欢JFrame自动重新格式化JFrame上的组件,特别是图像和JTextArea()之间的距离。我希望,如果可能的话,无论用户将JFrame调整为何种大小,图像和JTextArea之间的距离都应保持不变。如果有帮助,这是我其余的代码:
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);
}
答案 0 :(得分:0)
您可以通过多种方式“实现”,但是基本的答案是,您需要选择一个或多个更适合您需求的布局管理器。
例如,使用GridBagLayout
,您可以执行......
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);
}
}
}
看看Laying Out Components Within a Container了解更多详细信息和想法
您的代码中有些东西是“关闭”的,但这是...
tf = new JTextArea();
tf.setPreferredSize(new Dimension(300, 200));
p.add(tf);
可能是最引人注目的。
通常来说,JTextArea
将受益于JScrollPane
的包装。另外,由于在多个平台上呈现文本的方式不一致,因此应避免使用setPreferredSize
(实际上,应避免一般使用),而应依靠rows, columns
构造函数,根据当前的字体和图形属性进行计算。