Avatar billede Slettet bruger
15. december 2008 - 12:17 Der er 10 kommentarer og
1 løsning

Friggin layout bugger

Hej eksperter,

Følgende kode får det tredje JPanel, Panel_Output, til at fylde hele vinduet og ikke placere sig som angivet ved koordinaterne:


package CircularPies;

import java.awt.Color;

import javax.swing.*;

@SuppressWarnings("serial")
public class Frame_Main extends JFrame
{
    private JPanel Panel_Drawing = new JPanel(null);
    private JPanel Panel_Input = new JPanel(null);
    private JPanel Panel_Output = new JPanel(null);
   
    private JLabel Label_Input_Count = new JLabel("Count:");
    private JSpinner Spinner_Input_Count = new JSpinner();
   
    private JLabel Label_Output_Total1 = new JLabel("Total points:");
    private JLabel Label_Output_Total2 = new JLabel("0");
    private JLabel Label_Output_Inside1 = new JLabel("Points inside:");
    private JLabel Label_Output_Inside2 = new JLabel("0");
    private JLabel Label_Output_Outside1 = new JLabel("Points outside:");
    private JLabel Label_Output_Outside2 = new JLabel("0");
    private JLabel Label_Output_Ratio1 = new JLabel("Point ratio:");
    private JLabel Label_Output_Ratio2 = new JLabel("N/A");
    private JLabel Label_Output_Result1 = new JLabel("Resulting pi:");
    private JLabel Label_Output_Result2 = new JLabel("N/A");
   
    public Frame_Main()
    {
        // Text definition
        super("Circular Pies");
       
        // Panels setup
        Panel_Drawing.setLocation(5, 5);
        Panel_Drawing.setSize(408, 408);
        Panel_Drawing.setBorder(BorderFactory.createTitledBorder("Lolcake"));
        Panel_Input.setLocation(417, 5);
        Panel_Input.setSize(128, 128);
        Panel_Input.setBorder(BorderFactory.createTitledBorder("Lolcake"));
        Panel_Output.setLocation(417, 137);
        Panel_Output.setSize(128, 128);
        Panel_Output.setBorder(BorderFactory.createTitledBorder("Lolcake"));
       
        // Input setup
        Label_Output_Inside1.setLocation(408, 4);
       
        // Elements finalization
        Panel_Input.add(Label_Input_Count);
        Panel_Input.add(Spinner_Input_Count);
        Panel_Output.add(Label_Output_Total1);
        Panel_Output.add(Label_Output_Total2);
        Panel_Output.add(Label_Output_Inside1);
        Panel_Output.add(Label_Output_Inside2);
        Panel_Output.add(Label_Output_Outside1);
        Panel_Output.add(Label_Output_Outside2);
        Panel_Output.add(Label_Output_Ratio1);
        Panel_Output.add(Label_Output_Ratio2);
        Panel_Output.add(Label_Output_Result1);
        Panel_Output.add(Label_Output_Result2);
        this.add(Panel_Drawing);
        this.add(Panel_Input);
        this.add(Panel_Output);
       
        // Frame setup
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(1200, 700);
        this.setResizable(false);
        this.setVisible(true);
    }
}


Hvad er der galt?
Avatar billede Slettet bruger
15. december 2008 - 12:28 #1
Jeg fandt ud af det... Host. Min lærer fandt ud af det; jeg manglede et content-panel, men det har jeg fikset nu.
Avatar billede Slettet bruger
15. december 2008 - 12:28 #2
package CircularPies;

import java.awt.Color;

import javax.swing.*;

@SuppressWarnings("serial")
public class Frame_Main extends JFrame
{
    private JPanel Panel_Content = new JPanel(null);
    private JPanel Panel_Drawing = new JPanel(null);
    private JPanel Panel_Input = new JPanel(null);
    private JPanel Panel_Output = new JPanel(null);
   
    private JLabel Label_Input_Count = new JLabel("Count:");
    private JSpinner Spinner_Input_Count = new JSpinner();
   
    private JLabel Label_Output_Total1 = new JLabel("Total points:");
    private JLabel Label_Output_Total2 = new JLabel("0");
    private JLabel Label_Output_Inside1 = new JLabel("Points inside:");
    private JLabel Label_Output_Inside2 = new JLabel("0");
    private JLabel Label_Output_Outside1 = new JLabel("Points outside:");
    private JLabel Label_Output_Outside2 = new JLabel("0");
    private JLabel Label_Output_Ratio1 = new JLabel("Point ratio:");
    private JLabel Label_Output_Ratio2 = new JLabel("N/A");
    private JLabel Label_Output_Result1 = new JLabel("Resulting pi:");
    private JLabel Label_Output_Result2 = new JLabel("N/A");
   
    public Frame_Main()
    {
        // Text definition
        super("Circular Pies");
       
        // Panels setup
        Panel_Drawing.setLocation(5, 5);
        Panel_Drawing.setSize(408, 408);
        Panel_Drawing.setBorder(BorderFactory.createTitledBorder("Lolcake"));
        Panel_Input.setLocation(417, 5);
        Panel_Input.setSize(128, 128);
        Panel_Input.setBorder(BorderFactory.createTitledBorder("Lolcake"));
        Panel_Output.setLocation(417, 137);
        Panel_Output.setSize(128, 128);
        Panel_Output.setBorder(BorderFactory.createTitledBorder("Lolcake"));
       
        // Elements finalization
        Panel_Input.add(Label_Input_Count);
        Panel_Input.add(Spinner_Input_Count);
        Panel_Output.add(Label_Output_Total1);
        Panel_Output.add(Label_Output_Total2);
        Panel_Output.add(Label_Output_Inside1);
        Panel_Output.add(Label_Output_Inside2);
        Panel_Output.add(Label_Output_Outside1);
        Panel_Output.add(Label_Output_Outside2);
        Panel_Output.add(Label_Output_Ratio1);
        Panel_Output.add(Label_Output_Ratio2);
        Panel_Output.add(Label_Output_Result1);
        Panel_Output.add(Label_Output_Result2);
        Panel_Content.add(Panel_Drawing);
        Panel_Content.add(Panel_Input);
        Panel_Content.add(Panel_Output);
        this.add(Panel_Content);
       
        // Frame setup
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(1200, 700);
        this.setResizable(false);
        this.setVisible(true);
    }
}
Avatar billede arne_v Ekspert
16. december 2008 - 01:38 #3
setLocation ????

Hvad med at bruge LayoutManager's ?
Avatar billede Slettet bruger
16. december 2008 - 06:57 #4
Jeg gider ærlig talt ikke bruge tid på at sætte mig ind i Layout Managers, da jeg, som du nok har opdaget, primært beskæftiger mig med C#. Derfor vil jeg, i de to-tre visuelle Java-projekter jeg når at lave, hellere anvende null-LM, da jeg så kan spare besværet ved at sætte mig ind i systemet, der kun anvendes i et enkelt sprog. Egentlig er det meningen, at de studerende (Programmering C, HTX) skal anvende NetBeans' drag-and-drop-system og slet ikke koncentrere sig om design af frames, men da NetBeans' generelle funktionalitet er elendig i forhold til Ellipse, har jeg personeligt valgt at skrive alle mine programmer (hvilket forresten ikke bliver mange inden foråret) i det.
Giver det mening?
Avatar billede arne_v Ekspert
17. december 2008 - 01:23 #5
Du kan også drop and drag i Eclipse hvis du installerer VE plugin.
Avatar billede arne_v Ekspert
17. december 2008 - 01:33 #6
Det er rigtigt at .NET kun kommer med dock og anchor funktionalitet og ikke en
LayoutManager, men søger du på nettet vil du finde mange implementationer af
LayoutManager for .NET !
Avatar billede Slettet bruger
17. december 2008 - 07:43 #7
Hmm, jeg har aldrig før hørt om Visual Editor, men det lader til at være udmærket :) Tak.
Jeg kan ikke rigtig se, hvad manager-systemet gør godt for - ligegyldigt på hvilken platform det er baseret. For mig at se, er det altid lettest selv at opgive elementers opførsel ved størrelsesændringer (tager trods alt kun et par minutter) end at skabe store layout-systemer. Eller hvad?
Avatar billede arne_v Ekspert
17. december 2008 - 16:19 #8
Pointen ved LayoutManager er ikke at den sparer udvikleren for at placere og size komponenterne. Pointen
er at den dynamisk resizer og eventuelt omplacerer, hvis brugerne runtime resizer vinduet.
Avatar billede Slettet bruger
17. december 2008 - 16:28 #9
I know. Men det er jo også nemt at gøre efter uden LayoutManagers... Typist bare skrive en kort formel til justering af Top og Left og/eller Width og Height. Jeg plejer at være 4-5 min. om at fikse 2-3 komponenter således... I hånden vel at mærke. Hvis Microsoft tænkte ud af deres kasseformede celle og lavede et system til automatisering af proceduren, ville det uden tvivl være at foretrække over LayoutManagers.
Avatar billede arne_v Ekspert
18. december 2008 - 04:09 #10
Jeg tror at du undervurderer hvad LayoutManagers kan.

Proev og leg med:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class LMFun extends JFrame implements ChangeListener, ActionListener {
    private static final int MIN_W = 100;
    private static final int MIN_H = 100;
    private static final int DEF_W = 200;
    private static final int DEF_H = 200;
    private static final int MAX_W = 500;
    private static final int MAX_H = 500;
    public LMFun() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Arnes LM fun");
        setLayout(new FlowLayout());
        for(int i = 1; i <= 12; i++) {
            getContentPane().add(createPanel(i));
        }
        pack();
    }
    private static final Color[] cols = { Color.GRAY, Color.WHITE, Color.RED, Color.GREEN, Color.BLUE,
                                          Color.YELLOW, Color.CYAN, Color.MAGENTA, Color.ORANGE, Color.PINK };
    private JPanel createPanel(int no) {
        JPanel res = new JPanel();
        if(no % 2 == 0) {
            res.setLayout(new GridLayout(2, 2));
            res.add(createButton(cols[no % cols.length]));
            res.add(createButton(cols[no % cols.length]));
            res.add(createButton(cols[no % cols.length]));
            res.add(createButton(cols[no % cols.length]));
        } else {
            res.setLayout(new BorderLayout());
            res.add(createButton(cols[no % cols.length]), BorderLayout.CENTER);
            res.add(createButton(cols[no % cols.length]), BorderLayout.NORTH);
            res.add(createButton(cols[no % cols.length]), BorderLayout.SOUTH);
            res.add(createButton(cols[no % cols.length]), BorderLayout.WEST);
            res.add(createButton(cols[no % cols.length]), BorderLayout.EAST);
        }
        JSlider verjs = new JSlider(JSlider.VERTICAL, MIN_H, MAX_H, DEF_H);
        verjs.addChangeListener(this);
        JSlider horjs = new JSlider(JSlider.HORIZONTAL, MIN_W, MAX_W, DEF_W);
        horjs.addChangeListener(this);
        JPanel wrapper = new JPanel();
        wrapper.setLayout(new BorderLayout());
        wrapper.add(res, BorderLayout.CENTER);
        wrapper.add(verjs, BorderLayout.EAST);
        wrapper.add(horjs, BorderLayout.SOUTH);
        wrapper.setBorder(BorderFactory.createTitledBorder("Panel #" + no));
        wrapper.setPreferredSize(new Dimension(DEF_W, DEF_H));
        return wrapper;
    }
    private JButton createButton(Color c) {
        JButton res = new JButton();
        res.setBackground(c);
        res.setText("Bla");
        res.addActionListener(this);
        return res;
    }
    @Override
    public void stateChanged(ChangeEvent e) {
        JSlider js = (JSlider)e.getSource();
        JPanel jp = (JPanel)js.getParent();
        if(!js.getValueIsAdjusting()) {
            if(js.getOrientation() == JSlider.VERTICAL) {
                jp.setPreferredSize(new Dimension(jp.getWidth(), js.getValue()));
            } else if (js.getOrientation() == JSlider.HORIZONTAL) {
                jp.setPreferredSize(new Dimension(js.getValue(), jp.getHeight()));
            }
            jp.revalidate();
        }
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        JOptionPane.showMessageDialog(this, "Du må ikke klikke her");
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new LMFun();
                f.setVisible(true);
            }
        });
    }
}
Avatar billede Slettet bruger
18. december 2008 - 07:29 #11
Uha. Tak for koden, men jeg tror ikke, jeg kommer til at bruge den. Jeg fandt fejlen den 15., og, forhåbentligt, kommer jeg aldrig til at arbejde med GUI i Java igen ;)
Længe leve konsolapplikationer!
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