Disposition de panneau d'oscillation de Java
Je travaille sur un projet Java pour le collège qui nous implique de configurer un serveur TCP et un client. J'ai cette partie qui fonctionne et maintenant pour ajouter plus d'une sensation à mon projet, je veux ajouter une interface graphique.
Nous n'avons pas encore commencé à en apprendre davantage sur les interfaces graphiques en Java. Cependant, je veux essayer car je pense que ce serait un exercice utile. J'ai une interface graphique très basique configurée et l'ActionListener approprié défini pour le bouton. Mon prochain problème est de positionner mes panneaux afin qu'ils aient l'air propres et bien rangés sur le Cadre...
Pour le moment j'ai tous les composants d'un panneau, comme on le voit ci-dessous:
public ClientGUI(){
//Initialise Frame
frame = new JFrame("TCP Client");
//Initialise Panel 1 & Components
p1 = new JPanel();
//Set Layout
p1.setLayout(new GridLayout(1,2));
//Label 1 - For TextArea
l1 = new JLabel("Chat Log");
p1.add(l1);
//TextArea - To display conversation
t1 = new JTextArea(10,10);
p1.add(t1);
//Label 2 - For TextField
l2 = new JLabel("Message");
p1.add(l2);
//Message Box - For user input
t2 = new JTextField(10);
p1.add(t2);
//Button 1 - To send message
b1 = new JButton("Send");
p1.add(b1);
//Add panels to frame
frame.add(p1);
//Frame properties...
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400,400);
frame.setVisible(true);
//Add Event listener to button
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ev){
//do something
t1.setText(t2.getText());
}
});
J'aimerais que cela ressemble à quelque chose comme le wireframe rugueux ci-dessous.
J'apprécierais tous les commentaires que quelqu'un pourrait avoir! Merci beaucoup.
2 answers
Ce que vous voulez est appelé BoxLayout, qui alimente les éléments de l'interface utilisateur dans des colonnes ou des lignes. Et puis vous pouvez les imbriquer les uns dans les autres, par exemple avoir un panneau de mise en page de boîte horizontale comme élément dans un autre qui est vertical (un peu comme les tables HTML imbriquées). Donc, tous vos éléments iraient dans un BoxLayout vertical de niveau supérieur et la ligne qui a JLabel2 et JTextField serait sa propre BoxLayout horizontale imbriquée dans la disposition verticale de niveau supérieur. Ici est un assez décent tutoriel sur les gestionnaires de mise en page et il comprend le BoxLayout.
Il y a beaucoup de façons différentes, et beaucoup de LayoutManager
différentes à utiliser.
En savoir plus sur eux ici:
Voici un exemple que j'ai faite qui utilise GridBagLayout
:
//necessary imports
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
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.JTextField;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
public class Test {
/**
* Default constructor for Test.class
*/
public Test() {
initComponents();
}
public static void main(String[] args) {
/**
* Set look and feel of app
*/
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
// If Nimbus is not available, you can set the GUI to another look and feel.
}
/**
* Create GUI and components on Event-Dispatch-Thread
*/
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Test test = new Test();
}
});
}
/**
* Initialize GUI and components (including ActionListeners etc)
*/
private void initComponents() {
JFrame jFrame = new JFrame("Chat Test");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setResizable(false);
//Initialise Panel 1 & Components
JPanel p1 = new JPanel(new GridBagLayout());
JPanel p2 = new JPanel(new GridBagLayout());
//Label 1 - For TextArea
JLabel l1 = new JLabel("Chat Log");
//TextArea - To display conversation
final JTextArea t1 = new JTextArea(10, 10);
JScrollPane pane = new JScrollPane(t1);
//Label 2 - For TextField
JLabel l2 = new JLabel("Message");
//Message Box - For user input
final JTextField t2 = new JTextField(10);
//Button 1 - To send message
JButton b1 = new JButton("Send");
GridBagConstraints gc = new GridBagConstraints();
gc.fill = GridBagConstraints.HORIZONTAL;
gc.weightx = 1;
gc.gridx = 0;
gc.gridy = 0;
p1.add(l1, gc);
gc.gridx = 0;
gc.gridy = 1;
p1.add(pane, gc);
GridBagConstraints gc2 = new GridBagConstraints();
gc2.fill = GridBagConstraints.HORIZONTAL;
gc2.weightx = 1;
gc2.gridx = 0;
gc2.gridy = 0;
gc2.ipadx = 10;
p2.add(l2, gc2);
gc2.gridx = 1;
gc2.gridy = 0;
p2.add(t2, gc2);
gc2.gridx = 1;
gc2.gridy = 1;
p2.add(b1, gc2);
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ev) {
//do something
t1.setText(t2.getText());
}
});
jFrame.add(p1, BorderLayout.CENTER);
jFrame.add(p2, BorderLayout.SOUTH);
//pack frame (size JFrame to match preferred sizes of added components and set visible
jFrame.pack();
jFrame.setVisible(true);
}
}