#java #swing #layout-manager #japplet
#java #swing #макет-менеджер #japplet
Вопрос:
Я новичок в программировании Java-апплетов и Java в целом, но я очень хорош в C # и C . В любом случае я создаю простой калькулятор с JTextField, JButton и JLabel. Но JButton и JTextField занимают весь экран, и самое странное, что я устанавливаю размер, а он не устанавливает размер. Итак, что я делаю не так? Вот приведенный ниже код, чтобы кто-нибудь мог мне помочь; Я буду признателен за любые ответы.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import javax.swing.JApplet;
import java.awt.*;
import javax.swing.JButton;
import javax.swing.JTextField;
/**
*
* @author Danny
*/
public class Applet extends JApplet {
private JButton button1;
private JTextField textBox1;
@Override
public void paint(Graphics g)
{
g.setFont(new Font("Courier", Font.PLAIN, 12));
g.drawString("Enter a number: ", 36, 36);
return;
}
/**
* Initialization method that will be called after the applet is loaded
* into the browser.
*/
@Override
public void init() {
button1 = new JButton("Calculate");
textBox1 = new JTextField("number");
textBox1.setFont(new Font("Courier", Font.PLAIN, 12));
textBox1.setSize(100, 36);
button1.setSize(100, 36);
textBox1.setLocation(new Point(36, 76));
button1.setLocation(new Point(36, 70));
Container c = getContentPane();
c.add(button1);
c.add(textBox1);
c.setBackground(Color.gray);
}
// TODO overwrite start(), stop() and destroy() methods
}
Ответ №1:
Здесь необходимо учитывать макеты. Панель содержимого JApplet по умолчанию использует BorderLayout, и если вы добавляете компонент в BorderLayout без второго параметра, указывающего, куда его добавить, он будет добавлен BorderLayout .ЦЕНТРИРУЙТЕ и заполните как можно больше места. Ключ к решению этой проблемы — узнать как можно больше о менеджерах компоновки и использовать эту информацию в своих интересах. Вы можете найти эту информацию здесь: Визуальное руководство по менеджерам компоновки.
Обратите внимание, что часто мы вкладываем JPanels, каждый из которых использует свой собственный менеджер компоновки, удобный для программистов, для создания сложных, но простых в управлении макетов.
например,
import java.awt.*;
import javax.swing.*;
public class Applet extends JApplet {
private JButton button1;
private JTextField textBox1;
@Override
public void init() {
button1 = new JButton("Calculate");
textBox1 = new JTextField("number");
textBox1.setFont(new Font("Courier", Font.PLAIN, 12));
JPanel myPanel = new JPanel(); // JPanel uses FlowLayout by default
myPanel.add(new JLabel("Enter a number: "));
myPanel.add(textBox1);
myPanel.add(button1);
myPanel.setBackground(Color.gray);
getContentPane().add(myPanel, BorderLayout.CENTER);
}
}
Также обратите внимание, что setSize обычно игнорируется большинством менеджеров компоновки. Вместо этого обычно используется значение preferredSize, но этого следует избегать, поскольку вместо этого вы захотите, чтобы сами компоненты устанавливали свой preferredSize на основе их содержимого или других свойств (например, строк и столбцов для JTextArea или столбцов для JTextField или строкового текста для JLabel).
Ответ №2:
Разобраться в том, как работают классы Swing, может быть довольно сложно, поэтому я чувствую вашу боль.
Вы должны учитывать JApplet
, что используемый вами фрейм имеет a Container
, который использует значение по умолчанию Layout
, то есть BorderLayout
. В этом случае любой добавляемый вами контент будет привязан к размеру JApplet
(который вы, вероятно, задаете в HTML).
Попробуйте выполнить следующее:
public void init() {
setLayout(new FlowLayout());
button1 = new JButton("Calculate");
textBox1 = new JTextField("number");
textBox1.setFont(new Font("Courier", Font.PLAIN, 12));
textBox1.setSize(100, 36);
button1.setSize(100, 36);
JPanel contentPanel = new JPanel();
contentPanel.add(button1);
contentPanel.add(textBox1);
getContentPane().add(contentPanel );
c.setBackground(Color.gray);
}
Хорошее эмпирическое правило, которое я использую, — вставлять все Component
объекты в свои собственные JPanel
, прежде чем добавлять их в родительский контейнер, что позволяет избежать некоторых странностей, присущих макету Swing.
Также смотрите: Руководство по компоновке Swing
Комментарии:
1. Извините, но я не согласен с вашим «эмпирическим правилом». Часто размещение компонентов в их собственной JPanel не является хорошей идеей. Лучше узнать о менеджерах компоновки и использовать эти знания для их правильного использования.
2. Даже при использовании правильной процедуры компоновки Swing делает странные вещи, если вы пытаетесь добавить «сырые» компоненты в контейнеры. Я не говорю, что вставлять каждый компонент в отдельную JPanel.