Swing: Ändern der Größe eines JFrames wie Frames unter Linux, z
Ich würde gerne wissen, ob es eine Möglichkeit gibt, die Größe eines JFrames so zu ändern, dass die Größe geändert wurde, wie zum Beispiel bei den Standardfenstern unter Linux. Genauer gesagt: Wenn der Benutzer mit dem Ziehen beginnt, wird nur die zukünftige Größe des Fensters in der Vorschau angezeigt, während die Größe des ursprünglichen Inhalts nicht geändert wird. Sobald der Benutzer die Maustaste loslässt, ändert sich die Größe des Rahmens auf diese Größe. In Bildern:
(1) Zustand vor Größenänderung
(2) Benutzer fängt an zu schleppen (am roten Kreis)
(3) Der Benutzer lässt die Maus los, und die Größe des Rahmens wird geändert
Kann man das in Java Swing realisieren?
BEARBEITEN:
Da dieses Programm eines Tages auch unter Java RE als 7 laufen sollte, habe ich versucht, mKorbel-Vorschläge mit dem Vorschlag im Kommentar und mit dem transluzenten Frame zu kombinieren. Das Ergebnis ist nahe am Ziel, abgesehen davon
Der Inhalt des Inhaltsbereichs ändert die Größe, nachdem ich die Maus nicht mehr bewege, und nicht, wenn die Maus losgelassen wirdDie Größe des Rahmentitels wird sofort geändert, nicht nur, wenn ich aufhöre, den Rahmen zu ziehen.Es funktioniert nur, wenn die Größe von rechts oder unten geändert wird, andernfalls wird der Inhalt beim Ziehen verschoben.Ich denke, dass der erste Punkt durch eine Kombination aus dem Code und einem MouseListener aufgelöst werden kann, etwa wenn mouseReleased () die Größe ändert. Hier ist der Code, zögern Sie nicht, es zu versuchen. Für weitere Anregungen freue ich mich trotzdem über Anregungen.
Der Code ist eine geringfügige Änderung desGradientTranslucentWindowDemo.java aus den Java Tutorials. Ich hoffe, es ist erlaubt, es hier zu posten, andernfalls weisen Sie mich bitte auf eine Verletzung des Urheberrechts hin. Das schwarze JPanel soll der Inhalt der Anwendung sein, wobei das contentPane unsichtbar bleibt.
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.beans.PropertyChangeListener;
import javax.swing.*;
import static java.awt.GraphicsDevice.WindowTranslucency.*;
public class GroundFrame extends JFrame {
Timer timer;
JPanel panel2;
public GroundFrame() {
super("GradientTranslucentWindow");
setBackground(new Color(0,0,0,0));
setSize(new Dimension(300,200));
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel() {
panel.setBackground(new Color(0,0,0,0));
setContentPane(panel);
setLayout(null);
panel2 = new JPanel();
panel2.setBackground(Color.black);
panel2.setBounds(0,0,getContentPane().getWidth(), getContentPane().getHeight());
getContentPane().add(panel2);
addComponentListener(new ComponentListener() {
@Override
public void componentShown(ComponentEvent e) {}
@Override
public void componentResized(ComponentEvent e) {
timer = new Timer(50, new Action() {
@Override
public void actionPerformed(ActionEvent e) {
if(timer.isRunning()){
}else{
resizePanel(getContentPane().getSize());
}
}
@Override
public void setEnabled(boolean b) {}
@Override
public void removePropertyChangeListener(PropertyChangeListener listener) {}
@Override
public void putValue(String key, Object value) {}
@Override
public boolean isEnabled() {return false;}
@Override
public Object getValue(String key) {return null;}
@Override
public void addPropertyChangeListener(PropertyChangeListener listener) {}
});
timer.setRepeats(false);
timer.start();
}
@Override
public void componentMoved(ComponentEvent e) {}
@Override
public void componentHidden(ComponentEvent e) {}
});
}
public void resizePanel(Dimension dim){
panel2.setBounds(0,0,dim.width, dim.height);
repaint();
}
public static void main(String[] args) {
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
boolean isPerPixelTranslucencySupported =
gd.isWindowTranslucencySupported(PERPIXEL_TRANSLUCENT);
if (!isPerPixelTranslucencySupported) {
System.out.println(
"Per-pixel translucency is not supported");
System.exit(0);
}
JFrame.setDefaultLookAndFeelDecorated(true);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
GroundFrame gtw = new GroundFrame();
gtw.setVisible(true);
}
});
}
}