В JApplet добавлено управление JButton, и JButton заполняет весь экран - PullRequest
1 голос
/ 06 октября 2011

Я новичок в программировании 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
}

Ответы [ 2 ]

4 голосов
/ 06 октября 2011

Вы должны принять во внимание макеты здесь. ContentPane JApplet по умолчанию использует BorderLayout, и если вы добавите компонент в BorderLayout без второго параметра, сообщающего ему, куда его добавить, он будет добавлен BorderLayout.CENTER и заполнит как можно больше места. Ключ к решению этой проблемы - узнать как можно больше о менеджерах компоновки и использовать эту информацию в своих интересах. Вы можете найти эту информацию здесь: Визуальное руководство для менеджеров по макету .

Обратите внимание, что часто мы вкладываем 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 обычно игнорируется большинством менеджеров по расположению. Вместо этого предпочтение обычно отдается предпочтению, но этого следует избегать, так как вместо этого вы захотите, чтобы сами компоненты установили свой предпочтительный размер на основе их содержимого или других свойств (таких как строки и столбцы для JTextArea или столбцы для JTextField или текст String. для JLabel).

2 голосов
/ 06 октября 2011

Получить представление о том, как функционировать классы Swing, может быть довольно сложно, поэтому я чувствую вашу боль.

Вы должны учитывать, что используемый вами кадр JApplet имеет 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

...