/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Kun én komponent vises i panel mm.
Fra : Simon Mikkelsen


Dato : 06-12-00 21:32


Jeg er igang med et program, hvor jeg i brugerfladen vil placere et canvas
i midten af vinduet, og et textfield i bunden.

Jeg har valgt at bruge BorderLayout, fordi der senere også skal være
komponenter til højre for canvasset.

Når programmet startes, får jeg et kort blink af canvasset, og så bliver
hele vinduet gråt. Resizer jeg vinduet, bliver både canvas og textfield nu
vist, men istedet for at have deres angivne størrelser, fylder de begge så
meget af vinduet de kan.

Problemet er altså dels at der ikke bliver vist noget ved programstart, men
også at komponenterne ikke beholder deres angivne størrelser.

Jeg har prøvet alt i alle de eksempler jeg har, men uheldigvis er min
JAVA-bog så genial, at den kun har eksempler som JAVA-appletter, og jeg
laver en applikation (en applet har jo nogle indbyggede ting, som
applikationer ikke har). I Suns JAVA tutorial, kan jeg også kun finde
applet-eksempler

Jeg har kopieret program koden ind, og håber meget på, at der er en der ved
hvad jeg har gjort forkert - koden er delt i to filer, da Graf.java kun
skal være en del af et lidt større program. Jeg har fjernet al kode, der
ikke har noget med selve problemet at gøre, så nogle af kommentarene,
virker ikke helt logiske.

<start KaldGraf.java>
import javax.swing.*;
import java.awt.*;
import Graf; //Til at tegne grafer

public class KaldGraf
{
   public static void main(String[] args)
   {
   new Graf(500,400);
   }
}



<start: Graf.java>
import javax.swing.*;
import java.awt.*;

public class Graf extends JFrame
{
   private TextField txa;
   private JPanel panel;
   private Canvas g;

   /** Constructor Graf, laver et vindue og gør det synligt
   *int win_brede er vinduets brede i pixels, int win_hoejde er
   vinduets højde i pixels*/
   public Graf(int wb, int wh)
   {
      setSize(wb,wh);    //Vinduets størrelse
      setVisible(true);
//Skal vinduet vises (ja)?
      
      /**Opretter textbox og labels*/
      txa = new TextField("t",1);

      /**Opretter canvas papir*/
      g = new Canvas();
      g.setSize(300,200);
      g.setBackground(Color.red);
      

      /**Opretter ny container*/
      panel = new JPanel();
      panel.setLayout(new BorderLayout());

      panel.add(g,BorderLayout.CENTER);
      panel.add(txa,BorderLayout.SOUTH);

      setContentPane (panel);

   }    //Slut på constructor: public Graf

} //Slut på public class Graf

--
Mvh. Simon Mikkelsen, stud. ing.

www.zip.dk - gratis fonte, grafik, wavs og pakkeprogrammer
guides i bl.a. WinZip, netværksinstalation og antispam.

 
 
Leon Jessen (06-12-2000)
Kommentar
Fra : Leon Jessen


Dato : 06-12-00 22:20

Eksempel på opbygning som fungerer:
(skal naturligvus samles med andre filer for at virke, men princippet er der
stadig!)

import javax.swing.*;
import java.awt.*;

public class BrowserView extends JFrame {

public final JButton HOME;
public final JButton BACK;
public final JButton FORWARD;
public final JButton QUIT;
public final JButton UP;
public final JButton DOWN;
public final JButton OPEN;

private JTextField LOCATION;
private JLabel STATUS;
private JLabel TITLE;
private JLabel MYTITLE;

/** Browser konstruerer et Browservindue med
* (1) kontrol- og scrollknapper
* (2) status,titel,location info
* (3) delvindue med display
* @param width vinduets bredde
* @param height vinduets højde
* @param d display komponenten
*/
BrowserView(int width, int height, BrowserDisplay d) {
file://INSERT
file://initialisering
HOME = new JButton("HOME");
BACK = new JButton("BACK");
FORWARD = new JButton("FORWARD");
QUIT = new JButton("QUIT");
UP = new JButton("SCROLLUP");
DOWN = new JButton("SCROLLDOWN");
OPEN = new JButton("OPEN");

LOCATION = new JTextField("", 55);
STATUS = new JLabel("");
TITLE = new JLabel("");
MYTITLE = new JLabel("__________I N T E R N E T E X P L O I D E
R__________");

file://ContentPane
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
file://ContentPane NORTH
JPanel cpN = new JPanel(new GridLayout(4,1));

file://ContentPane NORTH 1
JPanel cpN1 = new JPanel(new FlowLayout());
file://cpN1.setForeground(Color.white);
file://cpN1.setBackground(Color.blue);
cpN1.add(MYTITLE).setForeground(Color.black);

file://ContentPane NORTH 2
JPanel cpN2 = new JPanel(new FlowLayout(0));
cpN2.add(BACK);
cpN2.add(FORWARD);
cpN2.add(HOME);
cpN2.add(QUIT);

file://ContentPane NORTH 3
JPanel cpN3 = new JPanel(new FlowLayout(0));
cpN3.add(LOCATION);
cpN3.add(OPEN);

file://ContentPane NORTH 4
JPanel cpN4 = new JPanel(new FlowLayout());
cpN4.add(TITLE);

cpN.add(cpN1);
cpN.add(cpN2);
cpN.add(cpN3);
cpN.add(cpN4);

cp.add(cpN, BorderLayout.NORTH);

JPanel cpW = new JPanel(new FlowLayout());
file://cpW.add(BACK);
cp.add(cpW, BorderLayout.WEST);

JPanel cpC = new JPanel(new FlowLayout());
cpC.setBackground(Color.white);
cpC.add(d);
cp.add(cpC, BorderLayout.CENTER);

JPanel cpE = new JPanel(new FlowLayout());
file://cpE.add(FORWARD);
cp.add(cpE, BorderLayout.EAST);

JPanel cpS = new JPanel(new GridLayout(2,1));
JPanel cpS1 = new JPanel(new FlowLayout());
JPanel cpS2 = new JPanel(new FlowLayout());

cpS1.add(UP);
cpS1.add(DOWN);
cpS2.add(STATUS).setForeground(Color.black);

cpS.add(cpS1);
cpS.add(cpS2);

cp.add(cpS, BorderLayout.SOUTH);

file://addWindowListener(new ExitController());
setTitle("dIntProg - Browser opgave. Leon Jessen MD1 u001657");
setSize(width,height);
setVisible(true);
}

/** showStatus viser en statustekst i browservinduet
* @param s tekst der skal vises */
public void showStatus(String s) {
file://INSERT
STATUS.setText(s);
}

/** showStatus viser titlen på et htmldokument i browservinduet
* @param s titlen der skal vises */
public void showTitle(String s) {
file://INSERT
TITLE.setText("This site's title: "+s);
}

/** showLocation viser en url i browservinduets locationfelt
* @param s den url-tekst der skal vises */
public void showLocation(String s) {
file://INSERT
LOCATION.setText(s);
}

/** getLocation returnerer den url (i tekstform) der vises i
* browservinduet
* @return url-teksten der fremvises i location-feltet */
public String getLocationText() {
file://INSERT
return (LOCATION.getText());
}

}


--
___________________________
Glædelig Jul *<|

Med venlig hilsen
Stud. Scient.
Leon I. Jesse

Ulrik Magnusson (06-12-2000)
Kommentar
Fra : Ulrik Magnusson


Dato : 06-12-00 22:32

> Når programmet startes, får jeg et kort blink af canvasset, og så bliver
> hele vinduet gråt. Resizer jeg vinduet, bliver både canvas og textfield nu
> vist, men istedet for at have deres angivne størrelser, fylder de begge så
> meget af vinduet de kan.

Det skyldes BorderLayout - den arbejder ikke med absolutte størrelser, men
modificerer
størrelser efter behov (i henhold til Component.getPreferredSize() og
Component.getMinimumSize()): http://citm.org/notes/java/week8/01.html
Du kan godt arbejde med absolutte størrelser, men det anbefales ikke
(platforms-uafhængighed).

Problemet med at det ikke vises kan klares ved at indsætte følgende til sidst i
konstruktøren:

invalidate();
validate();

Ellers kan du lave en BorderLayout til Frame'n og smide Panel'et på på Center.
Jeg ved ikke, hvorfor det ikke virker uden..

Ulrik Magnusson


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408929
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste