Permalänk
Medlem

Maximera knapp + JFrame

Hej!
Rubriken är lite fel tror jag, det ska stå
Varför funkar inte setSize på JPanel?

Men iaf, som ni så har jag en layout med lite olika grejer här. Men nu är det som så att min Jpanel inte fungerar, jag skulle vilja ha en statisk storlek på den (200,200) men detta fungerar inte utan den anpassar sig helt efter fönstrets storlek och så vill jag inte ha det.
Hur ska jag göra för att få den ska få en statisk storlek?

package layout; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.util.Observable; import java.util.Observer; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; import model.*; import controller.*; public class View extends JFrame implements Observer { private Model model; private Controller controller; private JList list; private JButton btnAddCircle = new JButton("Add Circle"); private JButton btnAddRectangle = new JButton("Add rectangle"); private JButton btnAddBorder = new JButton("Add Border"); private JButton btnAddLine = new JButton("Add Line"); private JButton btnAddText = new JButton("Add Text"); private DrawPanel panel = new DrawPanel(); public View(Model model, Controller controller) { this.model = model; this.controller = controller; model.addObserver(this); JPanel listPanel = new JPanel(); listPanel.setLayout(new BoxLayout(listPanel, BoxLayout.Y_AXIS)); JPanel layerListPanel = new JPanel(); JPanel layerOptionPanel = new JPanel(); layerListPanel.setLayout(new BorderLayout()); layerOptionPanel.setLayout(new BoxLayout(layerOptionPanel, BoxLayout.Y_AXIS)); list = new JList(model.getLayers()); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); list.addListSelectionListener(controller); JScrollPane pane = new JScrollPane(); pane.getViewport().add(list); layerListPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); layerListPanel.add(pane); layerOptionPanel.add(btnAddRectangle); layerOptionPanel.add(Box.createRigidArea(new Dimension(5,5))); layerOptionPanel.add(btnAddCircle); layerOptionPanel.add(Box.createRigidArea(new Dimension(5,5))); layerOptionPanel.add(btnAddLine); layerOptionPanel.add(Box.createRigidArea(new Dimension(5,5))); layerOptionPanel.add(btnAddText); layerOptionPanel.add(Box.createRigidArea(new Dimension(5,5))); layerOptionPanel.add(btnAddBorder); btnAddCircle.addActionListener(controller); btnAddCircle.setActionCommand("btnAddCircle"); btnAddBorder.setActionCommand("btnAddBorder"); btnAddBorder.addActionListener(controller); btnAddRectangle.setActionCommand("btnAddRectangle"); btnAddRectangle.addActionListener(controller); btnAddLine.setActionCommand("btnAddLine"); btnAddLine.addActionListener(controller); btnAddText.setActionCommand("btnAddText"); btnAddText.addActionListener(controller); layerOptionPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 5)); listPanel.add(layerListPanel, BorderLayout.SOUTH); listPanel.add(layerOptionPanel, BorderLayout.NORTH); add(listPanel, BorderLayout.EAST); panel.setSize(200, 200); panel.setBackground(Color.red); getContentPane().add(panel); setSize(800, 500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); } public void update(Observable obs, Object arg) { if("load".equals(arg)) list.setListData(model.getLayers()); list.updateUI(); repaint(); } public static void main(String[] args) { Model model = new Model(); Controller controller = new Controller(model); View view = new View(model, controller); view.setVisible(true); } private class DrawPanel extends JPanel { private static final long serialVersionUID = 1L; public void paintComponent(Graphics g) { super.paintComponent(g); for (Layer layer : model.getLayers()) layer.paint(g); } } }

Permalänk
Medlem

EDIT: Ja ja, det är ju roligt att du byter ut originalfrågan mot en helt annan medan man skriver...

Det finns inget enkelt sätt att göra det på en JFrame. Som jag ser det har du tre alternativ:

1) ge framen en fix storlek genom att anropa setResizable(false). Då kommer maximera-knappen fortfarande synas, men vara "gråad" (disabled).

2) ge framen en särskild "maximized bounds", dvs den får den storlek och position som du bestämmer när användaren väljer att maximera, genom setMaximizedBounds. Man behöver dock göra mer för att förhindra användaren från att "maximera" fönstret genom att helt enkelt dra i det...

3) Fulhacka bort effekten av maximering med en WindowStateListener, som den här killen visar. Samma grej där dock, finns inget som hindrar användaren från att dra i fönstret.

Det är i mina ögon egentligen bara lösning 1 som är det enda raka om man verkligen inte vill tillåta maximering. För varför ta bort maximeraknappen om användaren ändå kan dra i fönstret så att det blir i princip maximerat? Man kan ta till lite tricks för att ignorera storleksförändringar som går över en viss gräns man själv sätter: man kan med lite möda t.ex. få ett fönster att tillåta storleksförändringar så länge det inte blir större än 1024x768, eller vad man nu vill. Men det är lite hackigt och inte så snyggt. Inget som jag känner för att skriva exempel för på en lördagkväll iaf.