17. november 2005 - 14:17
Der er
9 kommentarer
Opdatere et JPanel
Hvordan opdaterer man et JPanel når man fx klikker på en knap? Vi har prøvet repaint() og validate(), men ingen af dem virkede. Det panel, vi har prøvet at opdatere indeholder faner. Vi fik det til at virke ved at skrive: tabbedPane.removeAll(); tabbedPane.addTab("Person", getTabPersonPane()); tabbedPane.addTab("Løn", getTabPersonPane()); tabbedPane.addTab("Barsel", getTabPersonPane()); Men det kan da ikke passe, at der ikke er en decideret update-dims, der kan gøre det samme og som virker på alle JPanels, eller hvad?
Annonceindlæg fra DE-CIX
17. november 2005 - 16:34
#1
Hvad er det I gør, som ikke bliver opdateret?
17. november 2005 - 16:35
#2
Og hvad hvis I kalder validate på tabbedPane i stedet for det panel den er tilføjet til?
17. november 2005 - 16:42
#3
Det burde slet ikke være nødvendigt. Et eksempel til inspiration: import javax.swing.JTabbedPane; public class Exp665297 extends javax.swing.JFrame { public Exp665297() { initComponents(); setSize(400,400); } private void initComponents() { tab = new javax.swing.JTabbedPane(); jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); getContentPane().add(tab, java.awt.BorderLayout.CENTER); jButton1.setText("Add tab"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addNewTab(evt); } }); getContentPane().add(jButton1, java.awt.BorderLayout.NORTH); jButton2.setText("Remove tab"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { removeLastTab(evt); } }); getContentPane().add(jButton2, java.awt.BorderLayout.SOUTH); pack(); } private void addNewTab(java.awt.event.ActionEvent evt) { int i = tab.getComponentCount(); tab.addTab("tab " + i, new JTabbedPane()); } private void removeLastTab(java.awt.event.ActionEvent evt) { int i = tab.getComponentCount(); tab.remove(i -1); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new NewJ().setVisible(true); } }); } private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JTabbedPane tab; }
17. november 2005 - 16:44
#4
Nej, det burde ikke være nødvendigt, men nogle gange kan man altså godt komme ud for at at ens paneler skal gentegnes manuelt.
17. november 2005 - 16:51
#5
Enig, men det skyldes generelt måden det er bygget op, og det har vi stadig tilgode
17. november 2005 - 22:59
#6
Her er vores JScrollPane. Det er hér man vælger en person, hvis data så skal vises i dét JPanel, der skal opdateres: private void getSearchListPane() { list = new JList(callback.getNames()); scrollingList = new JScrollPane(list); list.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION); list.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { JList list = (JList) e.getSource(); Object[] selected = list.getSelectedValues(); selectedItem = (String) selected[0]; if (!empClicked){ mainContentPane.remove(startPane); mainContentPane.add(getTabPane(), BorderLayout.CENTER); } tabbedPane.removeAll(); tabbedPane.addTab("Person", getTabPersonPane()); tabbedPane.addTab("Løn", getTabPersonPane()); tabbedPane.addTab("Barsel", getTabPersonPane()); empClicked = true; } }); list.setFixedCellWidth(200); list.setFixedCellHeight(15); list.setVisibleRowCount(4); searchPane.add(scrollingList, BorderLayout.CENTER); } Her er det JPanel, der indeholder de tre tabs, der bliver fjernet og tilføjet hver gang, der klikkes på et navn. private JPanel getTabPane() { tabPane = new JPanel(); tabPane.setLayout(new BorderLayout()); tabPane.setName("tabPane"); tabPane.setForeground(new Color(0, 0, 0)); tabPane.setFont(new Font("Arial", 0, 12)); tabPane.setVisible(true); tabbedPane = new JTabbedPane(); tabbedPane.addTab("Person", getTabPersonPane()); tabbedPane.addTab("Løn", getTabSalaryPane()); tabbedPane.addTab("Barsel", getTabLeavePane()); //Add the tabbed pane to this panel. tabPane.add(tabbedPane, BorderLayout.CENTER); tabPane.add(getTabQuitPane(), BorderLayout.SOUTH); return tabPane; } Og her er til sidst den tab, der skal opdateres: private JPanel getTabPersonPane() { JPanel tabPersonPane = new JPanel(); tabPersonPane.setLayout(new BorderLayout()); JPanel westPane = new JPanel(); westPane.setLayout(new BorderLayout()); JPanel leftPane = new JPanel(new GridLayout(12, 1, 0, 18)); JPanel rightPane = new JPanel(new GridLayout(12, 1, 0, 18)); leftPane.add(new JLabel(test)); rightPane.add(new JLabel("")); JTextField navn = new JTextField(17); leftPane.add(new JLabel("Navn:")); rightPane.add(navn); JTextField adresse = new JTextField(17); leftPane.add(new JLabel("Adresse:")); rightPane.add(adresse); JTextField zipcodeTown = new JTextField(17); leftPane.add(new JLabel("Postnr. og by:")); rightPane.add(zipcodeTown); JTextField phoneno = new JTextField(17); leftPane.add(new JLabel("Telefonnr.:")); rightPane.add(phoneno); JTextField mobileno = new JTextField(17); leftPane.add(new JLabel("Mobilnr.:")); rightPane.add(mobileno); JTextField cpr = new JTextField(17); leftPane.add(new JLabel("CPR-nummer:")); rightPane.add(cpr); westPane.add(leftPane, BorderLayout.WEST); westPane.add(rightPane, BorderLayout.EAST); JPanel southPanel = new JPanel(); southPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); ... tabPersonPane.add(westPane, BorderLayout.WEST); tabPersonPane.add(southPanel, BorderLayout.SOUTH); return tabPersonPane; }
19. november 2005 - 10:50
#7
Har taget et hurtigt kig, er på vej ud af døren og vender ikke tilbage før tirsdag. Men, hvad sker der her ?? hvad er "startPane" for en fætter ?? if (!empClicked){ mainContentPane.remove(startPane); mainContentPane.add(getTabPane(), BorderLayout.CENTER); } tabbedPane.removeAll(); tabbedPane.addTab("Person", getTabPersonPane()); tabbedPane.addTab("Løn", getTabPersonPane()); tabbedPane.addTab("Barsel", getTabPersonPane()); empClicked = true; Skal ikke den se nogenlunde sådan ud ??? if (!empClicked){ mainContentPane.remove(startPane); startPane = getTabPane(); mainContentPane.add(startPane, BorderLayout.CENTER); } empClicked = true; Det jeg gætter på, er at i måske har nogle referencer som IKKE peger derhen hvor i tror, så i ikke får fjernet de ting i tror i fjener. Hvis jeg gætter forkert, så prøv scrollingList.validate() alternativt scrollingList.invalidate()
23. november 2005 - 17:24
#8
Lykkedes det ?
23. november 2005 - 22:40
#9
Hej Carsten startPane er der når man starter programmet. tabPane skal først komme frem når man klikker på én af de ansatte i listen - det er derfor vi tjekker, om der allerede er klikket på en ansat. Din if(!empClicked)-sætning ser rigtigt nok smartere ud, men problemet er: Første gang, man kilkker på en ansat, kommer tabPane godt nok frem, men når man efterfølgende klikker på en ansat, opdateres det ikke med dennes info når jeg bruger tabPane.validate() - det gør det når jeg fjerner alle tab'erne og tilføjer dem igen.
Kurser inden for grundlæggende programmering