Avatar billede ng-km Nybegynder
26. juli 2002 - 12:35 Der er 6 kommentarer og
1 løsning

JPanel på JTabbedPane

Den vedlagte kode (5 klasser) viser, ekstremt simplificeret, mit program der skal kunne vise forskelligt definerede Labels på forskellige faner.

Mit problem er at mine labels ikke bliver vist med hvid baggrund, selv om jeg har sat baggrundsfarven til hvid. Problemet kan delvis løses ved at lade class Label extende Canvas, men det giver et problem med at labels på fanerne ikke bliver vist ordentligt, (formentligt pga blanding af Swing og awt), og står oven i hinanden indtil der skiftes fane første gang.

Hvordan finder jeg en løsning der giver mig en hvid baggrund på Labels og samtidig giver et pænt opstartsbillede, uden at skifte fane først??

Prøv at kompilere koden og se problemet med egne øjne. Jeg arbejder i JDK 1.3.

Jeg håber koden er tydelig nok!!

//-----------------------------------class-------------

class StartCMCLabel
{
public static void main(String args[])
{
  GUIMain gui = new GUIMain();
  gui.setVisible(true);
}//main
}//class

//-----------------------------------class---------------------

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

public class GUIMain extends JFrame
{
private JTabbedPane tp;
private CMCPanel cmcPanel;
private LagerPanel lagerPanel;
   
public GUIMain()
{
  setSize(550,600);
  setResizable(false);
  setTitle("Test");
  Toolkit toolkit = Toolkit.getDefaultToolkit();
  Dimension screenSize = toolkit.getScreenSize();
  Dimension selfBounds = getSize();
  setLocation((screenSize.width - selfBounds.width) / 2, (screenSize.height - selfBounds.height) / 2);

  tp = new JTabbedPane(JTabbedPane.TOP);
  cmcPanel = new CMCPanel(this);
  lagerPanel = new LagerPanel(this);

  tp.addTab("CMC-label", null, cmcPanel);
  tp.addTab("Lager-label", null, lagerPanel);

  getContentPane().add(tp);

  addWindowListener(new ProgramTerminator());
}//constructor

private class ProgramTerminator extends WindowAdapter
{
  public void windowClosing(WindowEvent e)
  {
    System.exit(0);   
  }
}//ProgramTerminator
}//GUIMain

//-----------------------------------class-------------
import java.awt.*;
import javax.swing.*;

public class LagerPanel extends JPanel
{
private Label labelPanel;
private JFrame owner;
   
public LagerPanel(JFrame owner)
{
  super(null,false);
  this.owner = owner;
 
  labelPanel = new Label();
  labelPanel.setEnabled(true);
  labelPanel.setBounds(10,10,400,297);
  labelPanel.setBackground(new Color(255,255,255));
  labelPanel.setForeground(new Color(0,0,0));
  this.add(labelPanel);
}//constructor
}//LagerPanel

//-----------------------------------class-------------

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

public class CMCPanel extends JPanel
{
private Label labelPanel;
private JFrame owner;

public CMCPanel(JFrame owner)
{
  super(null,false);
  this.owner = owner;

  labelPanel = new Label();
  labelPanel.setEnabled(true);
  labelPanel.setBounds(10,10,191,503);
  labelPanel.setBackground(new Color(255,255,255));
  this.add(labelPanel);
  }//constructor
}//CMCPanel

//-----------------------------------class-------------
import javax.swing.*;
import java.awt.*;

public class Label extends JPanel //Canvas
{
public void paint(Graphics g)
{
  g.drawLine(0,260, 210,260);
}//paint
}//Label
Avatar billede carstenknudsen Nybegynder
26. juli 2002 - 18:33 #1
Jeg har kigget på din kode og kørt den.
Det eneste jeg kan se der giver problemer
er dine setBounds metodekald. Er de virkelig
nødvendige? Det ser ud til at uden dem
er der ikke problemer (jeg har sammenlignet
med min egen brug a JTabbedPane).
Avatar billede ng-km Nybegynder
27. juli 2002 - 09:30 #2
Jeg bliver nød til at kunne definere forskellige størrelser på de labels der skal vises på hver fane. De skal vise helt nøjagtigt hvad brugeren får udskrevet på sine labels, på den givne label-størrelse.
Avatar billede carstenknudsen Nybegynder
27. juli 2002 - 18:29 #3
Jeg er ikke helt sikker på at jeg forstår
præcis hvad du vil, men her er et eksempel
med JTabbedPane der i to forskellige tabs
viser forskellige billeder i JLabels,
du kan bruge navnene på nogle billedfiler
du har for at teste det; sørg for at
billederne har forskellige dimensioner.
import javax.swing.*;
import java.awt.image.*;
public class ShowLabels extends JFrame {
    public ShowLabels() {
    JTabbedPane pane  = new JTabbedPane();
    JPanel panel1 = new Panel1();
    JPanel panel2 = new Panel2();
    pane.add( panel2 );
    pane.add( panel1 );
    getContentPane().add( pane );
    setSize( 500, 500 );
    }
    private static class Panel1 extends JPanel {
    public Panel1() {
        add( new JLabel( new ImageIcon( "ik.png" ) ) );
    }
    }
    private static class Panel2 extends JPanel {
    public Panel2() {
        add( new JLabel( new ImageIcon( "ikeda2.png" ) ) );
    }
    }
    public static void main( String[] args ) {
    JFrame frame = new ShowLabels();
    frame.show();
    }
}
Avatar billede ng-km Nybegynder
27. juli 2002 - 21:15 #4
Til carstenknudsen >> Undskyld, det er mig der ikke udtrykker mig klart nok.. Med labels mener jeg rent faktisk labels til en printer, og det er meningen at den label der skal printes ud, opbygges af brugeren på den enkelte fane, på det definerede label-område (kan være Avery-label), så brugeren får en slags WYSIWYG (tilnærmet ihvertfald). Din kode er helt fin, og jeg beklager hvis min beskrivelse har givet dig unødigt arbejde. Jeg havde slet ikke forestillet mig at det kunne forveksles med JLabel, men det kan det selvfølgelig. Min fejl..
Avatar billede carstenknudsen Nybegynder
28. juli 2002 - 10:36 #5
Jeg er godt klar over at det ikke er en
JLabel du er interessert i, det jeg viste
var at hvis du kommer dit billede ind
i en JLabel kan du vise billede uden
de problemer du har når du bruger
setBounds metoden; den tror jeg er synderen.
I en JLabel kan du sætte størrelsen
manuelt og tegne hvor du har lyst, det
kan du iøvrigt også i et JPanel og mange
andre komponenter. Du kan sagtens offset'e
din tegning og få det som du vil. Det er
snarere det du skal gøre end sætte bounds
eksplicit.
Avatar billede ng-km Nybegynder
28. juli 2002 - 13:01 #6
carstenknudsen >> Jeg er enig med dig i at det nok er setBounds(..) der er synderen, ihvertfald når jeg extender fra JPanel, men det er ikke det problem jeg får ved at extende fra Canvas. Der vises områderne fra de forskellige faner oven i hinanden indtil jeg skifter fane første gang, derefter virker alt som jeg gerne vil have det til. Label-området skal være hvidt i den størrelse der passer til den enkelte label, og brugeren kan tegne og skrive i området som det passe ham, derfor er det nødvendigt for mig med et afgrænset hvidt område. Jeg er ikke helt klar over hvad du mener med at jeg ikke skal afgrænse eksplicit, eller jeg kan sætte størrelsen manuelt.

Er du eventuelt interesseret i at få hele koden, selv om det endnu er en grov prototype, så kan du måske bedre se mit problem??
Avatar billede ng-km Nybegynder
29. juli 2002 - 23:29 #7
Jeg har selv løst problemet på en lidt u-fin måde, men det virker for mig, og jeg kan ikke bruge mere tid på at finde den forkromede løsning.

Jeg lod paint-metoden i min Label-klasse køre metoden
fillRect(.....) på det definerede område, med setColor(..) sat til hvid
inden jeg begyndte min tegning og skrivning på den enkelte label.
Ikke helt kønt, men det virker, og jeg kan bruge JPanel i stedet for Canvas, hvilket er det bedste (Swing/awt).......
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester