各位老大,小弟问一下,在java中写的单机版程序如何像金山词霸一样,每一个系统,同时只能有一个程序在跑?? 各位老大,小弟问一下,在java中写的单机版程序如何像金山词霸一样,每一个系统,同时只能有一个程序在跑?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在你包含main()方法的类里加一个static 的变量用于记录启动个数的值,每启动一个加1,当个数大于一的时候就退出多余的 什么意思??是不是只能启动一个界面出来??如果是这样的话,就很简单public void showWin() { if (child.getState() == JFrame.ICONIFIED) { child.setState(JFrame.NORMAL); } child.show();} 复人: cat_871017(零下九度) ( ) 信誉:100 2005-05-22 17:21:00 得分: 0 在你包含main()方法的类里加一个static 的变量用于记录启动个数的值,每启动一个加1,当个数大于一的时候就退出多余的 兄弟,这个方法我试了!好像不行!在一个机器上边,如果我开两个命令行,都去执行,都可以.例子代码如下:import java.awt.*;import java.awt.event.*;import javax.swing.*;public class B{ public static void main(String[] args) { A a=A.getOnlyA(); }}class A extends JFrame implements ActionListener{ private static int count=0; private JButton ok=null; private A() { getContentPane().add(getOk()); pack(); //this.show; setVisible(true); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); } public JButton getOk() { if(ok==null) { ok=new JButton("确定"); ok.addActionListener(this); } return ok; } public void actionPerformed(ActionEvent e) { Object obj=e.getSource(); if(obj==this.getOk()) { count--; System.exit(0); } } public static A getOnlyA() { A one=null; if(count<1) { one=new A(); } return one; } } zhaohao19853(贱人) 兄弟,我不知道这样称呼是否合适,但是我想回答你,我照着你得想法写了代码,不知道是否正确,你看看!但是结果不是我要得!代码如下:import java.awt.*;import java.awt.event.*;import javax.swing.*;public class B{ public static void main(String[] args) { A a=A.getOnlyA(); }}class A extends JFrame implements ActionListener{ private static int count=0; private JButton ok=null; private A() { getContentPane().add(getOk()); pack(); //this.show; setVisible(true); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); } public JButton getOk() { if(ok==null) { ok=new JButton("确定"); ok.addActionListener(this); } return ok; } public void actionPerformed(ActionEvent e) { Object obj=e.getSource(); if(obj==this.getOk()) { count--; System.exit(0); } } public static A getOnlyA() { A one=null; if(count<1) { one=new A(); if (one.getState() == JFrame.ICONIFIED) { one.setState(JFrame.NORMAL); } } return one; } }我是这样运行得,首先开启一个命令窗口,运行它,没有什么问题,然后在不关闭第一个得同时,又开启另一个命令窗口,同样可以运行,此时,在我得机器上有两个同样得程序在跑,这是我不像看见得!不知道我得意思你是否明白!谢谢回复~ java只能线程同步,不能进程同步办法好像有1. 检测端口,程序起来之后,邦定到一个特定端口2.锁定文件 FileChannel其他的方法,我就不知道了 最好用JNI方法。检测端口的话,要实现通信才行。检查某一个(或一组)端口。端口未占用,或者端口被使用却没有应答才行。否则已经启动的程序异常后,不杀进程就再也启动不起来了 import java.awt.BorderLayout;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.nio.channels.FileChannel;import java.nio.channels.FileLock;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;public class FileLockTest { public static void main(String[] args) throws IOException { File lockFile = new File(System.getProperty("user.home"), ".mylock"); FileOutputStream fos = new FileOutputStream(lockFile, true); FileChannel chanel = fos.getChannel(); FileLock lock = chanel.tryLock(); if (lock == null) { JOptionPane.showMessageDialog(null, "程序已经启动!"); System.exit(0); } JFrame f = new JFrame(); f.getContentPane().add(new JLabel("Started", JLabel.CENTER), BorderLayout.CENTER); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(400, 300); f.setLocationRelativeTo(null); f.show(); }} gtlang78() 兄弟,我的目的达到了,效果很不错,能不能给讲解一下啊!麻烦你了! 你去看看FileChannel类的 tryLock()方法的文档吧,简单的说就是尝试在同一个文件上加锁,如果成功了就返回一个FileLock对象,如果别的进程已经在这个文件上加过锁了,这个方法就返回null 谢谢 gtlang78() 前边的兄弟,不是说还有检查端口号的方法嘛?? 怎么搞??再说说我就结贴!!! 学到有用的东西了,谢谢gtlang78!检查端口的方法又如何实现? 检查端口的方法好像不如FileLock的方法保险,如果别的程序占用了指定的端口,这个程序就没法启动了import java.awt.BorderLayout;import java.io.IOException;import java.net.BindException;import java.net.ServerSocket;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;public class PortBindTest { public static void main(String[] args) throws IOException { try { ServerSocket ss = new ServerSocket(5678); } catch (BindException e) { JOptionPane.showMessageDialog(null, "程序已经启动!"); System.exit(0); } JFrame f = new JFrame(); f.getContentPane().add(new JLabel("Started", JLabel.CENTER), BorderLayout.CENTER); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(400, 300); f.setLocationRelativeTo(null); f.show(); }} 各位帮帮忙? 编写记事本时怎么样出现鼠标右击的菜单 菜鸟问题 java程序题 请教各位几个关于内部类的问题! 请教一个简单问题! 【网上看到这样一个题 但就是不明白 大神们指导下】 急!JAVA中写文件的问题! 哪位大哥帮帮小弟!!!!!!!! Spring Boot Actuator, endpoints.health.sensitive=false设置无效 求 Java 2 图形设计卷Ⅱ:SWING 电子书 求助:java里开启了事务后,如何使用预编译语句对象?
是不是只能启动一个界面出来??
如果是这样的话,就很简单
public void showWin() {
if (child.getState() == JFrame.ICONIFIED) {
child.setState(JFrame.NORMAL);
}
child.show();
}
在你包含main()方法的类里加一个static 的变量用于记录启动个数的值,每启动一个加1,当个数大于一的时候就退出多余的
兄弟,这个方法我试了!好像不行!在一个机器上边,如果我开两个命令行,都去执行,都可以.例子代码如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class B
{
public static void main(String[] args)
{
A a=A.getOnlyA();
}
}
class A extends JFrame implements ActionListener
{
private static int count=0;
private JButton ok=null;
private A()
{
getContentPane().add(getOk());
pack();
//this.show;
setVisible(true);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
public JButton getOk()
{
if(ok==null)
{
ok=new JButton("确定");
ok.addActionListener(this);
}
return ok;
}
public void actionPerformed(ActionEvent e)
{
Object obj=e.getSource();
if(obj==this.getOk())
{
count--;
System.exit(0);
}
}
public static A getOnlyA()
{
A one=null;
if(count<1)
{
one=new A();
}
return one;
}
}
兄弟,我不知道这样称呼是否合适,但是我想回答你,我照着你得想法写了代码,不知道是否正确,你看看!但是结果不是我要得!代码如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class B
{
public static void main(String[] args)
{
A a=A.getOnlyA();
}
}
class A extends JFrame implements ActionListener
{
private static int count=0;
private JButton ok=null;
private A()
{
getContentPane().add(getOk());
pack();
//this.show;
setVisible(true);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
public JButton getOk()
{
if(ok==null)
{
ok=new JButton("确定");
ok.addActionListener(this);
}
return ok;
}
public void actionPerformed(ActionEvent e)
{
Object obj=e.getSource();
if(obj==this.getOk())
{
count--;
System.exit(0);
}
}
public static A getOnlyA()
{
A one=null;
if(count<1)
{
one=new A();
if (one.getState() == JFrame.ICONIFIED)
{
one.setState(JFrame.NORMAL);
}
}
return one;
}
}我是这样运行得,首先开启一个命令窗口,运行它,没有什么问题,然后在不关闭第一个得同时,又开启另一个命令窗口,同样可以运行,此时,在我得机器上有两个同样得程序在跑,这是我不像看见得!不知道我得意思你是否明白!谢谢回复~
办法好像有
1. 检测端口,程序起来之后,邦定到一个特定端口
2.锁定文件 FileChannel
其他的方法,我就不知道了
检测端口的话,要实现通信才行。检查某一个(或一组)端口。端口未占用,
或者端口被使用却没有应答才行。否则已经启动的程序异常后,不杀进程就再也启动不起来了
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;public class FileLockTest {
public static void main(String[] args) throws IOException {
File lockFile = new File(System.getProperty("user.home"), ".mylock");
FileOutputStream fos = new FileOutputStream(lockFile, true);
FileChannel chanel = fos.getChannel();
FileLock lock = chanel.tryLock();
if (lock == null) {
JOptionPane.showMessageDialog(null, "程序已经启动!");
System.exit(0);
}
JFrame f = new JFrame();
f.getContentPane().add(new JLabel("Started", JLabel.CENTER),
BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400, 300);
f.setLocationRelativeTo(null);
f.show();
}
}
兄弟,我的目的达到了,效果很不错,能不能给讲解一下啊!麻烦你了!
前边的兄弟,不是说还有检查端口号的方法嘛??
怎么搞??
再说说我就结贴!!!
检查端口的方法又如何实现?
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;public class PortBindTest {
public static void main(String[] args) throws IOException {
try {
ServerSocket ss = new ServerSocket(5678);
} catch (BindException e) {
JOptionPane.showMessageDialog(null, "程序已经启动!");
System.exit(0);
} JFrame f = new JFrame();
f.getContentPane().add(new JLabel("Started", JLabel.CENTER),
BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400, 300);
f.setLocationRelativeTo(null);
f.show();
}
}