JPanel работает на JApplet
Я проектирую JApplet, и в основном этот апплет позволит пользователю нарисовать график квадратичного уравнения, и он вставит диапазоны как по оси x, так и по оси y. Но еще многое предстоит сделать, чтобы достичь этой точки.
Я все еще на этапе разработки интерфейса.
Вот мой код:
import java.awt.Dimension;
import javax.swing.BoxLayout;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class Applet extends JApplet {
JPanel p1;
JPanel p2;
JPanel p3;
JScrollPane s1;
public Applet() {
p1 = new JPanel();
p2 = new JPanel();
p3 = new JPanel();
s1 = new JScrollPane(p3,s1.VERTICAL_SCROLLBAR_ALWAYS,s1.HORIZONTAL_SCROLLBAR_ALWAYS);
}
@Override
public void init() {
super.init();
for(int i=0;i<100;i++)
{
p3.add(new JButton("Hello"));
p3.add(new JLabel("blah"));
p3.add(new JButton("Sup"));
}
p1.setPreferredSize(new Dimension(this.getWidth(), this.getHeight()));
p2.setPreferredSize(new Dimension(this.getWidth(),(int) (this.getHeight()*0.6667)));
p3.setLayout(new BoxLayout(p3,BoxLayout.PAGE_AXIS));
s1.setPreferredSize(new Dimension(this.getWidth(),(int)(this.getHeight()*0.33333)));
p1.add(p2);
p1.add(s1);
this.add(p1);
}
}
2 ответа
чтобы элементы управления по осям X и Y располагались друг над другом, у вас должно быть две панели, одна из которых включает в себя метки и текстовые поля для оси X в одной и те, что для оси Y в другой. Затем вы добавите их на панель, которая выровнена по вертикали. (
Box.createVerticalBox()
, например)Вы можете сделать свой
graph.java
ActionListener
кнопок "График" и "Уточнить". вactionPerformed
Метод graph.java, вы можете инициировать перерисовку, собирая диапазоны из экземпляра ControlsB.
РЕДАКТИРОВАТЬ: отвечая на ваши комментарии...
"Как добавить еще одну панель, чтобы я поместил ось X над осью Y"
это может быть так же просто, как (в ControlsB.java):
b = Box.createHorizontalBox();
b.add(new JLabel("Please enter range: "));
Box b0 = Box.createVerticalBox();//create a vertical box to stack the controls
Box b1 = Box.createHorizontalBox(); // create a horizontal box for the x-axis
b1.add(new JLabel(" x-axis "));
b1.add(new JLabel("from"));
JTextField f1 = new JTextField("-5");
f1.setMaximumSize(new Dimension(100,30));
b1.add(f1);
b1.add(new JLabel(" to "));
JTextField f2 = new JTextField("5");
f2.setMaximumSize(new Dimension(100,30));
b1.add(f2);
b1.add(new JLabel(". "));
Box b2 = Box.createHorizontalBox(); // create a second horizontal box for the y-axis
b2.add(new JLabel("y-axis "));
b2.add(new JLabel("from"));
JTextField f3 = new JTextField("5");
f3.setMaximumSize(new Dimension(100,30));
b2.add(f3);
b2.add(new JLabel("to"));
JTextField f4 = new JTextField("-5");
f4.setMaximumSize(new Dimension(100,30));
b2.add(f4);
b0.add(b1); // add the x-axis to the vertical box
b0.add(b2); // add the y-axis to the vertical box
b.add(b0); // add the vertical box to the parent
b.add(new JButton("Plot"));
b.add(new JButton("Refine"));
add(b); //is this necessary?
}
и как собрать диапазоны из экземпляра ControlsB...
Вы должны посмотреть в ActionListener
Из этого руководства вы узнаете, как заставить события нажатия кнопки инициировать действие в отдельном классе.
Также две критики:
в вашем основном классе,
GraphApplet
Вы создаетеBox
прежде чем передать его в каждый изControlsA
а такжеControlsB
конструктор. В конструкторе вы затем переназначаете Box, в котором вы прошли. Я не думаю, что вам нужно это делать. Либо создайте правильно выровненное поле вGraphApplet
передать это и не переназначать, или вообще ничего не передавать.Ваш
ControlsA
а такжеControlsB
классы оба расширяютсяJPanel
, Хотя вы идете на проблему добавления своихBox
контейнеры для каждого из них в конце их конструкторов, вы никогда не добавляете эти объекты Controls+ в родительский контейнер. В вашей текущей реализации я бы предложил, чтобы расширениеJPanel
не обязательно.
Рекомендации:
- Что касается наличия одного компонента поверх другого, используйте менеджер раскладки, который облегчит это, такой как вертикальный BoxLayout.
- Чтобы ваш дисплей реагировал на изменение числовых данных, я рекомендую вам спроектировать программу таким образом, чтобы ее было легко реализовать, используя дизайн приложения типа Model-View-Controller. Нажатие кнопки "заговор" или "уточнение" вызовет контроллер, который обновит данные модели. Представление или графический пользовательский интерфейс будут прослушивать изменения модели и, когда они происходят, перепланировать график на основе последних данных модели.