Diskuze: Zavření okna v Java swingu
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 17 zpráv z 17.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj,
frame.setVisible(true)// Zobraz okno
frame.setVisible(false)// nezobrazuj okno, ale proces je furt spuštěný,
tím okno nevypneš
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);//Tohle je to co
hledáš...
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
myslím, že tohle není to co hledá.. tohle mu vypne celý program, on chce
jen, aby zmizelo okno programu, ale aby ten program zůstal stále spuštěný
Tak drbnout do Netbeansu za behu programu frame.setVisible(false); je prasarna. Ale celkem zajimavy dotaz, zkusim poresit jak bude volno.
Máš ten frame inicializovaný ve chvíli kdy na něm voláš setVisible()? NullPointerException by napovídalo, že ne...
* To change this license header, choose License Headers in Project
Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package helloworldd;
import java.awt.GridBagLayout;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
*
* @author Lincerix
*/
public class HelloWorldd extends JFrame {
JFrame frame; Frame
JButton button;Tlačítko
JPanel panel;//Panel na zarovnání, aby nevyplňovalo tlačítko celou plochu
Framu
public HelloWorldd() {
panel = new JPanel(); Vytvoř panel
panel.setLayout(new GridBagLayout());Nastav panelu rozestavení
button = new JButton("VisibleFalse");Vytvoř tlačítko a pojmenuj
ho
button.setBounds(20, 20, 20, 20);Nastav tlačítko
frame = new JFrame(); Vytvoř frame
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);Aby se frame
zavíral
frame.setVisible(true);Aby byl Frame vidět
frame.setSize(200, 300);Rozměry Framu
button.addActionListener(údálost
new ActionListener() {
public void actionPerformed(ActionEvent ae) {
frame.setVisible(false);
}
}
);
panel.add(button);Nacpi tlačítko do panelu
frame.add(panel);//Nacpi panel do framu
}
public static void main(String[] args) {
// TODO code application logic here
HelloWorldd world = new HelloWorldd();//Všechno to pusť
}
}
ja bych to nechal zmizet asi takhle
frame = new JFrame() například Nechceš sem postnout celý ten kód rovnou, ať se na to můžem
kouknout?
main
*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package screenshot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;
public class ScreenShot extends JFrame {
public boolean vis = true;
ScreenShot(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Panel panel = new Panel();
this.add(panel);
this.setVisible(vis);
this.pack();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException{
ScreenShot ss = new ScreenShot();
// TODO code application logic here
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package screenshot;
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.BoxLayout;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Panel extends JPanel{
TextField ta;
String u;
Panel(){
FlowLayout f = new FlowLayout();
this.setLayout(f);
this.setPreferredSize(new Dimension(200, 200));
A a = new A();
JButton but = new JButton("Screenshot");
but.setMinimumSize(new Dimension(50, 50));
ta = new TextField("", 20);
ta.setMaximumSize(new Dimension(50, 50));
this.addMouseListener(a);
this.add(ta);
this.add(but);
Act act = new Act();
but.addActionListener(act);
}
public void shot() throws AWTException, IOException{
Robot robot = new Robot();
Rectangle area = new Rectangle(new Dimension(Toolkit.getDefaultToolkit().getScreenSize()));
BufferedImage buf = robot.createScreenCapture(area);
String cesta = System.getenv("HOME") + File.separator + "Plocha" + File.separator + u + ".jpg";
ImageIO.write(buf, "jpg", new File(System.getenv("HOME") + File.separator + "Plocha" + File.separator + u + ".jpg"));
}
public class Act implements ActionListener{
ScreenShot ss;
@Override
public void actionPerformed(ActionEvent e) {
try {
ss.setVisible(false);
u = ta.getText();
shot();
JOptionPane.showMessageDialog(null, "Hotovo");
} catch (AWTException ex) {
Logger.getLogger(Panel.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("chyba");
} catch (IOException ex) {
Logger.getLogger(Panel.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public class A implements MouseListener{
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
}
znovu main.. měl jsem tam kraviny.. už jsem zkoušel všechno
package screenshot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;
public class ScreenShot extends JFrame { ;
ScreenShot(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Panel panel = new Panel();
this.add(panel);
this.setVisible(true);
this.pack();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException{
ScreenShot ss = new ScreenShot();
// TODO code application logic here
}
}
Jak jsem čekal, voláš tam ss.setVisible() v té actionPerformed() v objektu 'a' ve třídě Act, aniž bys to ss předtím někde nějak vytvořil (inicializoval nebo získal předáním). Tu třídu Act vyhoď, je zbytečná, akci na tlačíko přidej tak jak ti to výše ukázal lincerix anonymní implementací ActionListeneru:
button.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent ae) {
ss.setVisible(false);
}
});
přičemž to 'ss' musíš dostat do toho panelu nejlépe parametrem jeho konstruktoru, budeš mít konstruktor: Panel(ScreenShot ss) ten budeš volat v ScreenShot - Panel panel = new Panel(this) a v tom konstruktoru toho panelu pak budeš mít dostupnou tu instanci toho objektu ScreenShot ss takže budeš moct udělat ss.setVisible()...
Btw pojmenovávat proměnné jedním či dvěma písmenky je nepěkný zvyk, takové kryptické zdrojáky se pak blbě čtou vůbec se toho neboj a pojmenuj si proměnnou nějakým vystižným pojmenováním, IDE to doplňuje při psaní z velké části za tebe, tak proč toho nevyužít a později oceníš že se to líp čte. Například to tlačítko - 'but' vs třeba startActionButton, doScreenshotButton, takePictureButton ...
Ještě bych dodal jenom k tomu, co napsal tady zdatný kolega Atrament, aby
ses vůbec nestyděl dělat komenty.
Mně tam sice komenty vypadly, protože se to celé drblo při kopírování z
telefonu, ale jak nebudeš dělat komenty, tak je to katastrofa - zvykni si na
to (kód je i pak
přehlednější pro lidi, co to čtou).
Zobrazeno 17 zpráv z 17.