Chodzi mi o to, żebym nie bawił się w rozkłady, tylko po prostu graficznie poustawiał sobie elementy i je później jedynie okodował.
Istnieją: link
Polecam Netbeans.
A mam pytanie przy okazji. Czy w praktyce na co dzień większość programistów używa tych programów typu NetBeans, czy raczej kodują rozmieszczenie komponentów itd ręcznie ?
Ech jak już robisz GUI w Javie to czemu jakieś średniowieczne technologie stosujesz zamiast JavaFX?
slayer9 napisał(a):
A mam pytanie przy okazji. Czy w praktyce na co dzień większość programistów używa tych programów typu NetBeans, czy raczej kodują rozmieszczenie komponentów itd ręcznie ?
Kiedyś pracowałem w korpo w projekcie w którym były własne abstrakcje na Swinga i w nich się tworzyło interfejs. Nie było graficznych programów do rozmieszczania komponentów. Ale to tylko jeden przypadek. Ogólny trend i tak jest taki, by pisać aplikacje webowe.
Pracowałem dawno temu w sporym projekcie ze Swingiem i był używany NetBeans, zresztą prawie wyłącznie do formatek, no chyba że jakieś pojedyncze osoby były jego fanami. :)
Czyli ręcznie tego nikt nie koduje ?
Ja koduję ręcznie. GUI Designera z NetBeans nie użyłbym nawet pod groźbą wyrywania zęba bez znieczulenia.
@Shalom i @Black007 też chyba są zwolennikami kodowania ręcznego (http://4programmers.net/Forum/Java/275924-swing_jtabbedpane_-_paskudny_wyglad_rozmieszczanie_komponentow).
bogdans napisał(a):
Ja koduję ręcznie.
a możesz powiedzieć jak wygląda u Ciebie np. metoda tworząca GUI? czy to cała klasa oddzielna?
ja np. Tworzę metodę initGUI w głównej klasie, są inne elegantsze sposoby?
Zazwyczaj tak:
public static void main(String[] args)
{
try
{
UIManager.LookAndFeelInfo[] info = UIManager.getInstalledLookAndFeels();
for(int i=0;i<info.length;i++)
{
if(info[i].getName().equals("Nimbus"))
{
UIManager.setLookAndFeel(info[i].getClassName());
}
}
}
catch(Exception e)
{}
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
new NazwaKlasy();
}
});
...
public NazwaKlasy()
{
setTitle(...);
setLayout(new BorderLayout(2,2));
add(createToolBar(),BorderLayout.NORTH);
JScrollPane sp = new JScrollPane(info);
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
add(sp,BorderLayout.CENTER);
add(createBottomPanel(),BorderLayout.SOUTH);
pack();
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//a jeśli trzeba posprzątać, to
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setVisible(true);
}
Jeśli kod opisujący jakiś fragment okna jest długi, to go przenoszę do metody, jeśli jest krótki (sp
w powyższym przykładzie), to zostawiam w konstruktorze.
czyli GUI opakowujesz w oddzielnej klasie:)
Nie zawsze, często stosuje takie coś:
JButton download = new JButton(...);
download.setToolTipText("Pobranie katalogu (pliku)");
download.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
download();
}
});
Metoda download()
jest metodą klasy tworzącej GUI.
od wielkości GUI uzależniasz to jak je tworzysz czy od czego?
Aktualnie piszę większą aplikację która ma lekko rozbudowane GUI i metody tworzące GUI są "duże" i nie wiem czy tak to się robi czy robię to źle...
private void initGUI() {
Label labelVillageAttacked = new Label("Lista wiosek atakowanych");
labelVillageAttacked.setMinWidth(250);
Label labelVillageMe = new Label("Lista wiosek Off");
labelVillageMe.setMinWidth(250);
Label labelList = new Label("Lista rozkazów");
labelList.setMinWidth(250);
//Create layout and Add a labels to layout.
HBox layoutLabel = new HBox();
layoutLabel.getChildren().addAll(labelVillageMe, labelVillageAttacked, labelList);
//Konstruktor text boxes and MIN width and height.
areaVillageAttacked = new TextArea();
areaVillageAttacked.setMinWidth(250);
areaVillageAttacked.setMinHeight(400);
areaVillageMe = new TextArea();
areaVillageMe.setMinWidth(250);
areaVillageMe.setMinHeight(400);
areaList = new TextArea();
areaList.setMinWidth(250);
areaList.setMinHeight(400);
areaList.setEditable(false);
//Create layout and add a text boxes
HBox layoutTextArea = new HBox();
layoutTextArea.getChildren().addAll(areaVillageMe, areaVillageAttacked, areaList);
Label labelUserName = new Label("Nazwa gracza");
labelUserName.setMinWidth(80);
textUserName = new TextField();
HBox layoutUserName = new HBox(20);
layoutUserName.getChildren().addAll(labelUserName, textUserName);
HBox layoutDate = new HBox(20);
labelDate.setMinWidth(80);
Tooltip toolTipTextDate = new Tooltip("Wybierz date z kalendarza lub podaj ręcznie w formacie 'dd.mm.rrrr'");
date.setTooltip(toolTipTextDate);
layoutDate.getChildren().addAll(labelDate, date);
HBox layoutTime = new HBox(20);
labelTime.setMinWidth(80);
Tooltip toolTipTextTime = new Tooltip("Podaj czas w formacie 'hh:mm:ss'");
textTime.setTooltip(toolTipTextTime);
textTime.setText((timeSetting.get(GregorianCalendar.HOUR_OF_DAY) < 10 ? "0" + timeSetting.get(GregorianCalendar.HOUR_OF_DAY) : timeSetting.get(GregorianCalendar.HOUR_OF_DAY)) +
":" + (timeSetting.get(GregorianCalendar.MINUTE) < 10 ? "0" + timeSetting.get(GregorianCalendar.MINUTE) : timeSetting.get(GregorianCalendar.MINUTE)) +
":" + (timeSetting.get(GregorianCalendar.SECOND) < 10 ? "0" + timeSetting.get(GregorianCalendar.SECOND) : timeSetting.get(GregorianCalendar.SECOND)));
layoutTime.getChildren().addAll(labelTime, textTime);
buttonCalculate = new Button("Oblicz");
buttonAttacks = new Button("Ilość Ataków");
HBox layoutButton = new HBox(10);
layoutButton.setAlignment(Pos.CENTER);
layoutButton.getChildren().addAll(buttonAttacks, buttonCalculate);
//add layout text boxes, layout labels, date
VBox layoutV = new VBox();
layoutV.getChildren().addAll(layoutLabel, layoutTextArea);
layout.getChildren().addAll(layoutV, layoutUserName, layoutDate, layoutTime, layoutButton);
root.getChildren().addAll(layout);
}
w innej metodzie tworzę cały pasek menuBar np.