Det kan ikke passe at det er så svært at placere ting på brugerfladen. Jeg har nu bøvlet i et par timer med JPanel, JFrame, Jthis og Jthat.. Er det svært at finde ud af eller er det mig der er helt forkert på den?
Mit arbejde hidtil:
public Main() { //Sætter nogle options på JFrame setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().setLayout(new BorderLayout()); setTitle("Talfinder");
//Declarer en liste og fylder den med tal fra talfinder() metoden List lst = talfinder();
//Laver labels og fylder dem med data String streng = "Arraylisten indeholder " + lst.size() + " udtrukne tal."; JLabel antaltal = new JLabel(streng); String streng2 = "Udtrukne tal: " + talstreng(lst); JLabel tal = new JLabel(streng2); String streng3 = "Talfinder version: 0.1"; JLabel version = new JLabel(streng3);
//Sætter panelet og fylder det med strings JPanel topPanel = new JPanel(); topPanel.setLayout( new BorderLayout() ); topPanel.add(version, BorderLayout.SOUTH); topPanel.add(antaltal, BorderLayout.NORTH); topPanel.add(tal, BorderLayout.WEST); getContentPane().add(topPanel);
public Main() { //Sætter nogle options på JFrame setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().setLayout(new BorderLayout()); setTitle("Talfinder");
//Sætter en button JButton knap = new JButton(); knap.setText("Hent nye tal"); knap.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { knap(evt); } });
//Laver labels og fylder dem med data String streng = "Arraylisten indeholder " + talfinder().size() + " udtrukne tal."; JLabel antaltal = new JLabel(streng); String streng2 = "Udtrukne tal: " + talstreng(talfinder()); JLabel tal = new JLabel(streng2); String streng3 = "Talfinder version: 0.1"; JLabel version = new JLabel(streng3);
//Sætter panelet og fylder det med strings JPanel topPanel = new JPanel(); topPanel.setLayout(new GridLayout(4,1)); getContentPane().add(topPanel); topPanel.add(knap); topPanel.add(antaltal); topPanel.add(tal); topPanel.add(version, BorderLayout.EAST); pack(); }
public static void main(String[] args) { Main f = new Main(); f.setVisible(true); }
private static List talfinder() { // Talfinder (finder tal imellem 1 og 50) Random generator = new Random(); List lst = new ArrayList();
// Finder 5 tal mellem 1 og 50 og fyld det på arraylisten for (int i = 0; i < 5; i++) { int num1 = generator.nextInt(50) + 1;
//smider det udtrukne tal "num1" i arraylisten lst.add(num1); } return lst; }
private static String talstreng(List lst) { //skriver tal i arraylisten ud String indexnr = ""; for (int i = 0; i < lst.size(); i++) { if(i > 0) indexnr += ","; indexnr += lst.get(i); } return indexnr; } }
Hvordan kan jeg gøre det sådan at den ikke laver noget når jeg kører programmet, men når jeg så trykker på knappen så skal den køre talfinder() og talstreng() og vise resultatet. Jeg forventer ingen færdig løsning.. bare et lille fingerpeg i den rigtige retning ville være godt :)
btw hvad er forskelle på: public Main() og public static void main(String[] args)??
public class Main extends JFrame { private JLabel antaltal; private JLabel tal; private JLabel version;
public Main() { //Sætter nogle options på JFrame setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().setLayout(new BorderLayout()); setTitle("Talfinder");
//Sætter en button JButton knap = new JButton(); knap.setText("Hent nye tal"); knap.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { knapklik(evt); } });
//Laver labels og fylder dem med data antaltal = new JLabel(""); tal = new JLabel(""); version = new JLabel("");
//Sætter panelet og fylder det med strings JPanel topPanel = new JPanel(); topPanel.setLayout(new GridLayout(4,1)); getContentPane().add(topPanel); topPanel.add(knap); topPanel.add(antaltal); topPanel.add(tal); topPanel.add(version); pack(); }
private void knapklik(java.awt.event.ActionEvent evt) { String streng = "Arraylisten indeholder " + talfinder().size() + " udtrukne tal."; antaltal.setText(streng); String streng2 = "Udtrukne tal: " + talstreng(talfinder()); tal.setText(streng2); String streng3 = "Talfinder version: 0.1"; version.setText(streng3); pack(); } public static void main(String[] args) { Main f = new Main(); f.setVisible(true); }
private static List talfinder() { // Talfinder (finder tal imellem 1 og 50) Random generator = new Random(); List lst = new ArrayList();
// Finder 5 tal mellem 1 og 50 og fyld det på arraylisten for (int i = 0; i < 5; i++) { int num1 = generator.nextInt(50) + 1;
//smider det udtrukne tal "num1" i arraylisten lst.add(num1); } return lst; } private static String talstreng(List lst) { //skriver tal i arraylisten ud String indexnr = ""; for (int i = 0; i < lst.size(); i++) { if(i > 0) indexnr += ","; indexnr += lst.get(i); } return indexnr; } }
Jeg har fjernet Pack(); så jeg kan lave vinduet større, så nu prøver jeg at lege lidt med dette:
JLabel version = new JLabel(streng3); version.setLocation(20, 35); version.setAlignmentY(40);
Men det hjælper ikke en pind... :/ Det jeg forsøger at gøre er at placere teksten i center og i bunden af dens "celle". Jeg har forsøgt mig med flere ting, men det er som om at noget forhindrer mig at ændre på placering af ting.. eller jeg gør det forkert ;)
public class Main extends JFrame { private JLabel antaltal; private JLabel tal; private JLabel klikviser; private static int klik = 0;
public static final int X = 100; // JFrame left X coordinate public static final int Y = 10; // JFrame top Y coordinate public static final int WIDTH = 400; // JFrame width public static final int HEIGHT = 420; // JFrame height
public Main() { //Sætter nogle options på JFrame setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //getContentPane().setLayout(new BorderLayout()); setTitle("Talfinder"); setBounds(X,Y,WIDTH,HEIGHT); try { UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName( ) ); } catch (Exception e) { }
//Sætter en button JButton knap = new JButton(); knap.setText("Hent nye tal"); knap.setBounds(20,20,100,100); knap.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { knapklik(evt); } });
//Laver labels antaltal = new JLabel(""); tal = new JLabel(""); klikviser = new JLabel("");
//Laver label og fylder den med data String streng3 = "version: 0.1"; JLabel version = new JLabel(streng3); version.setLocation(20, 35); version.setAlignmentY(40); //JLabel klikviser = new JLabel(klik);
//Sætter panelet og fylder det med strings JPanel topPanel = new JPanel(); topPanel.setLayout(new GridLayout(5,1)); getContentPane().add(topPanel); topPanel.add(knap); topPanel.add(antaltal); topPanel.add(tal); topPanel.add(klikviser); topPanel.add(version); //pack(); }
public static void main(String[] args) { Main f = new Main(); f.setVisible(true); }
private static List talfinder() { // Talfinder (finder tal imellem 1 og 50) Random generator = new Random(); List lst = new ArrayList();
// Finder 5 tal mellem 1 og 50 og fyld det på arraylisten for (int i = 0; i < 5; i++) { int num1 = generator.nextInt(50) + 1;
//smider det udtrukne tal "num1" i arraylisten lst.add(num1); } return lst; }
private static String talstreng(List lst) { //skriver tal i arraylisten ud String indexnr = ""; for (int i = 0; i < lst.size(); i++) { if(i > 0) indexnr += ", "; indexnr += lst.get(i); } return indexnr; } }
Det kører udmærket, men jeg kan ikke får teksten i de enkelte "celler" at flytte sig. Og jeg kunne også godt tænke mit at lave knappen mindre (pt så fylder den hele "cellen" ud)..
ok det prøver jeg så.. :) Det er bare ret svært at finde det rette sted at læse ting når man ikke har en bog :/ Jeg googl'er bare hver gang jeg har et problem, men desværre så løser det ikke altid problemet.. men heldigvis har vi så eksperten :)
prøv evt. at stil et konkret spørgsmål hvor du beskriver hvordan tingene skal se ud og se om ikke en af Swing hajerne kan komme op med den rigtige LayoutManager til det
Jeg har fået lidt hjælp fra en jeg kender (datamatiker) som har hjulpet mig meget.. en af tingene som jeg lærte af ham var at man godt kan add'e et JPanel til et andet JPanel, hvilket jo giver mig flere muligheder :) Hvertfald nok indtil videre.. ;)
Og en null-layout manager, er een hvor man angiver x,y beliggenheden for hvert dims (setLocation). Det lyder som en simpel og god løsning, men den har et problem, nemlig at Java er designet og beregnet til at kunne afvikles på mange platforme, hvor det ikke er sikkert de samme fonte findes, og hvor størrelser af diverse ting kan være anderledes (og mere end det). Derfor bøvler man med layout-managere. ;)
Er det muligt at have luft imellem cellerne på en GridLayout? Jeg har søgt rundt, men har ikke findet noget. f.eks. jeg har en knap og en ComboBox lige ved siden af hinanden, og jeg ønsker ligt 5-10 px af luft imellem... :)
public GridLayout(int rows, int cols, int hgap, int vgap)
Creates a grid layout with the specified number of rows and columns. All components in the layout are given equal size.
In addition, the horizontal and vertical gaps are set to the specified values. Horizontal gaps are placed between each of the columns. Vertical gaps are placed between each of the rows.
One, but not both, of rows and cols can be zero, which means that any number of objects can be placed in a row or in a column.
All GridLayout constructors defer to this one.
Parameters: rows - the rows, with the value zero meaning any number of rows cols - the columns, with the value zero meaning any number of columns hgap - the horizontal gap vgap - the vertical gap Throws: IllegalArgumentException - if the value of both rows and cols is set to zero
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.