Nekromanti Programmeringshjälp GUI och textplacering i Java

Max Raven

T12-kultist
Joined
20 Oct 2009
Messages
4,338
Location
Malmö
Okej, nu har jag kört fast - och GUIs är inte min starka sida. Det underliga för mig är att det här i stort sett använt kommandon som ska fungera i andra fall, och likförbannat fungerar det inte för mig. I korthet:
Man ska kunna positionera text i GUI i java. Uppgiften jag ska göra handlar om att sätta en text uppe i vänstra hörnet, en i mitten, en nere i högra hörnet, ovanpå tre färgfält (som jag fått att fungera. För närvarande får jag bara fram det här:


Koden som producerar det "miraklet" är följande:

<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>
import java.awt.*;
import javax.swing.*;
/**
* @param args
*/
public class TrippTrapp extends JPanel{ //Tillåter användning av andra funktioner utanför main
public static void main(String [] args) {
final int X = 200;
final int Y = 200;
final int WIDTH = 480; //Flaggproportioner
final int HEIGHT = 300; //efter svenska flaggan (t ex)
JLabel lTrap, lTrip, lTrul;

JFrame frame = new JFrame("TrippTrappTrull");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation(X,Y);
frame.setSize(WIDTH, HEIGHT);

lTrip = new JLabel("Tripp"); //Etiketter
lTrip.setHorizontalTextPosition(SwingConstants.RIGHT);
lTrip.setVerticalTextPosition(SwingConstants.TOP);


lTrap = new JLabel("Trapp");
lTrap.setHorizontalTextPosition(JLabel.LEFT);
lTrap.setVerticalTextPosition(JLabel.BOTTOM);

lTrul = new JLabel("Trull", SwingConstants.RIGHT);
lTrul.setHorizontalAlignment(SwingConstants.LEFT);
lTrul.setVerticalAlignment(SwingConstants.BOTTOM);


JPanel flaggbox = new TrippTrapp();
flaggbox.setPreferredSize(new Dimension(WIDTH, HEIGHT));
flaggbox.add(lTrip);
flaggbox.add(lTrap);
flaggbox.add(lTrul);
frame.getContentPane().add(flaggbox);
frame.pack();
frame.setVisible(true);
}
public void paintComponent(Graphics g) {
super.paintComponent(g); // Ritinstruktioner för rektanglar
g.setColor(Color.red);
g.fillRect(0, 0, 480, 100);

g.setColor(Color.blue);
g.fillRect(0, 100, 480, 100);

g.setColor(Color.cyan);
g.fillRect(0, 200, 480, 100);
}
</pre></div></div>
Någon som har några förslag på hur jag kan fixa det här?

Nu går jag och lägger mig, inte ett bra sätt att börja en ny vecka... :gremfrown:
 

morkbollen_UBBT

Warrior
Joined
12 Mar 2005
Messages
263
Location
Stockholm
Det var en stund sedan jag höll på med Java och framförallt GUI, men men...

Jag tror ditt problem är att du inte satt en layout på din Frame. Då tar den FlowLayout som standard vilket betyder att den lägger allt på rad. Jag skulle föreslå att du läser denna och provar GridLayout. Med lite trixande borde du kunna placera saker typ där du vill ha det. Jag såg att det fanns även en guide för att placera enbart enligt koordinater, så lycka till och fråga mer om det inte går! :gremwink:
 

krank

Går ondskans ärenden
Joined
28 Dec 2002
Messages
35,688
Location
Rissne
Jag tror att jag löste det genom att placera mina tre labels inuti paneler; jag har för mig att jag hade liknande problem och att den där textpositiongrejen funkade dåligt.

Men jag minns egentligen inte. Kan kolla ikväll om jag råkar ha uppgiften kvar...
 

Max Raven

T12-kultist
Joined
20 Oct 2009
Messages
4,338
Location
Malmö
morkbollen/krank: Jo, slog mig i morse att jag inte gett några definitioner för layout (eftersom jag gick efter programmeringsexemplen i teorihäftet). Vilken överraskning att den gör så här då va? :gremwink: (Edit: Sen upptäckte jag att jag inte behövde och felet var att standardlayout är rad-rad-rad... :gremfrown: ) Morkbollen: Du har no rätt, fast det verkar som man föredrar att använda layout med paneler (sidospår).

Såg det här också nu:
"Each JPanel object is initialized to use a FlowLayout, unless you specify differently when creating the JPanel. "

Ska se vilka alternativ jag har för layout lite senare. GridLayout tilltalar mitt precisionssinne men lär ju bli lite joxig om man förstorar panelen.

krank: Kan göra underpaneler, men måste ju fortfarande ge just dem något att gå på - åter till layout-delen alltså.

Övriga två obligatoriska uppgifter bör på pluskontot vara ganska enkla när jag väl löst den här (hade lite samma grej med 1-5, handlade mycket om att få reda på vilka funktioner som skötte jobbet jag ville ha gjort).

Tack för hjälpen så här långt! :gremsmile:
 

Max Raven

T12-kultist
Joined
20 Oct 2009
Messages
4,338
Location
Malmö
Omkodat lite:
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>
import java.awt.*;
import javax.swing.*;
/**
* @param args
*/
public class TrippTrapp{ //Tillåter användning av andra funktioner utanför main
public static void main(String [] args) {
final int X = 200;
final int Y = 200;
final int WIDTH = 480; //Flaggproportioner
final int HEIGHT = 300; //efter svenska flaggan (t ex)
JLabel lTrap, lTrip, lTrul;

JFrame frame = new JFrame("TrippTrappTrull");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation(X,Y);
frame.setSize(WIDTH, HEIGHT);

JPanel subPanel1 = new JPanel();
subPanel1.setPreferredSize(new Dimension(WIDTH, HEIGHT/3));
subPanel1.setBackground(Color.RED);
subPanel1.setLayout(new BorderLayout());
lTrip = new JLabel("Tripp", SwingConstants.LEFT); //Etiketter
lTrip.setHorizontalAlignment(SwingConstants.LEFT);
lTrip.setVerticalAlignment(SwingConstants.TOP);
subPanel1.add(lTrip);

JPanel subPanel2 = new JPanel();
subPanel2.setPreferredSize(new Dimension(WIDTH, HEIGHT/3));
subPanel2.setBackground(Color.WHITE);
subPanel2.setLayout(new BorderLayout());
lTrap = new JLabel("Trapp", SwingConstants.CENTER);
lTrap.setHorizontalAlignment(SwingConstants.CENTER);
lTrap.setVerticalAlignment(SwingConstants.CENTER);
subPanel2.add(lTrap);

JPanel subPanel3 = new JPanel();
subPanel3.setPreferredSize(new Dimension(WIDTH, HEIGHT/3));
subPanel3.setBackground(Color.CYAN);
subPanel3.setLayout(new BorderLayout());
lTrul = new JLabel("Trull", SwingConstants.RIGHT);
lTrul.setHorizontalAlignment(SwingConstants.RIGHT);
lTrul.setVerticalAlignment(SwingConstants.BOTTOM);
subPanel3.add(lTrul);

JPanel flaggbox = new JPanel();
flaggbox.setPreferredSize(new Dimension(WIDTH, HEIGHT));
flaggbox.add(subPanel1);
flaggbox.add(subPanel2);
flaggbox.add(subPanel3);
frame.getContentPane().add(flaggbox);
frame.pack();
frame.setVisible(true);
}

}
</pre></div></div>
Nuvarande utseende:


Och om man drar ut rutan lite.


Fördelar: Text fungerar! Yey!
Nackdelar: Av outgrundlig anledning får jag bård kring mina paneler. Dessa ökar storleken så att Trull försvinner (frame/panel räcker inte till) Möjliga lösningar: Rita rektanglar under panelerna eller ta bort bården för vanliga panelen(osäker på hur f n, borde gå).

För att fixa problemet med att Trull försvinner så kan man förstås göra huvudpanelen större i koden (och se till att frame:n är lika stor). Det fungerar. Hyfsat.

Annat problem: layouten för underpanelerna är f n standard - så om man drar ut rutan tillräckligt blir det olikfärgade rader, om än med texterna rätt. Lite osäker på hur jag ska åtgärda det f n. Hitta någon variant som gör att nya objekts layout läggs under gamla om det finns?

Jag knåpar vidare.

Edit: Löste båda problem m h a enkel byte av layout till boxlayout.

Happ! Till nästa uppgift för mig då.
 
Top