কীভাবে সামনে একটি উইন্ডো আনতে হবে?


90

আমাদের একটি জাভা অ্যাপ্লিকেশন রয়েছে যা যখন কোনও টেলিকন্ট্রোল প্রক্রিয়া অ্যাপ্লিকেশনটিতে কিছু সক্রিয় করে তখন অগ্রভাগে আনা দরকার।

এটি পেতে, আমরা ক্লাসের বলা পদ্ধতিতে উপলব্ধি করেছি যা আমাদের প্রয়োগের ফ্রেমের প্রতিনিধিত্ব করে (ক এর সম্প্রসারণ JFrame) নিম্নলিখিত বাস্তবায়ন:

setVisible(true);
toFront();

উইন্ডোজ এক্সপির অধীনে, এটি প্রথমবার বলা হয়ে কাজ করে, দ্বিতীয় বার কেবল টাস্কবারের ট্যাবটি জ্বলজ্বল করে, ফ্রেমটি আর সামনে আসে না। একই Win2k জন্য যায়। ভিস্তার উপর এটি ঠিক আছে বলে মনে হচ্ছে।

তোমার কোন ধারনা আছে?


আপনার কি এই আচরণের জন্য একটি নমুনা আছে?
অস্কাররাইজ

4
সঠিক উত্তরটি হ'ল toFront()ইডিটি ব্যবহার করে কল করা invokeLater। নীচে একটি সহজ উত্তর অন্তর্ভুক্ত রয়েছে, তবে এটি গৃহীত উত্তর নয়। এটি কাজ করে, যদিও। পুরোপুরি।
এরিক রবার্টসন

আমি জানি এটি পুরানো, তবে এটি
ওএসএক্সেও

আমি এই সমস্যাটি অনুভব করছি, তবে নীচের কোনও উত্তরই এটি সমাধান করছে বলে মনে হচ্ছে না। আমি নিশ্চিত যে এটি উইন্ডোজ আমাকে অ্যাপ্লিকেশনটিতে আমার প্রথম উইন্ডোটির জন্য 'চুরি' ফোকাস না দেওয়ার কারণে করেছে।
ক্রেগ ওয়ারেন

উত্তর:


69

একটি সম্ভাব্য সমাধান হ'ল:

java.awt.EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        myFrame.toFront();
        myFrame.repaint();
    }
});

8
সম্ভবত সবার আগে ইউআইএল কোডটি প্রথম জায়গায় চালু করা উচিত? ;)
java.is.for.desktop.indeed

4
৪.৯.৫.২.১ জা.তে জাভা in-তে আমার জন্য কাজ করেনি, উইন্ডোটি এখনও অন্যান্য প্রোগ্রামের নীচে লুকিয়ে থাকবে। আমাকে কী সাহায্য করেছিল তা উইন্ডোজ সামনে আনার ক্রম পরিবর্তন করছিল। একটি উইন্ডোটি লুকিয়ে দ্বিতীয় উইন্ডোটি প্রদর্শন করার পরিবর্তে দ্বিতীয় উইন্ডোটি দেখান এবং তারপরে প্রথম উইন্ডোটি (জেফ্রেম) লুকান।
লেকেনস্টেইন

4
উইন্ডোজ 10 এ্যাপলে জাভা 1.8 চলমান সাথে কাজ করে
এলিয়ট


33

JFrameউবুন্টু (জাভা 1.6.0_10) এর অধীনে সামনের দিকে একটি আনতে আমার একই সমস্যা ছিল । এবং এটি সমাধান করার একমাত্র উপায় হ'ল একটি সরবরাহ করে WindowListener। বিশেষত, JFrameযখনই toFront()আমন্ত্রণ করা হয় তখন আমাকে সর্বদা শীর্ষে থাকতে আমার সেট করতে হয়েছিল এবং windowDeactivatedইভেন্ট হ্যান্ডলারটি সরবরাহ করতে হয়েছিল setAlwaysOnTop(false)


সুতরাং, এখানে কোডটি একটি বেসে স্থাপন করা যেতে পারে JFrameযা সমস্ত অ্যাপ্লিকেশন ফ্রেমগুলি অর্জন করতে ব্যবহৃত হয়।

@Override
public void setVisible(final boolean visible) {
  // make sure that frame is marked as not disposed if it is asked to be visible
  if (visible) {
      setDisposed(false);
  }
  // let's handle visibility...
  if (!visible || !isVisible()) { // have to check this condition simply because super.setVisible(true) invokes toFront if frame was already visible
      super.setVisible(visible);
  }
  // ...and bring frame to the front.. in a strange and weird way
  if (visible) {
      toFront();
  }
}

@Override
public void toFront() {
  super.setVisible(true);
  int state = super.getExtendedState();
  state &= ~JFrame.ICONIFIED;
  super.setExtendedState(state);
  super.setAlwaysOnTop(true);
  super.toFront();
  super.requestFocus();
  super.setAlwaysOnTop(false);
}

যখনই আপনার ফ্রেম প্রদর্শিত বা সামনে কল এনে দেওয়া উচিত frame.setVisible(true)

যেহেতু আমি উবুন্টু 9.04 সরানো সেখানে তার মধ্যে কোন প্রয়োজন আছে বলে মনে হয় WindowListenerআবাহন জন্য super.setAlwaysOnTop(false)- যেমন লক্ষ্য করা যায়; এই কোড পদ্ধতিতে সরানো হয়েছিল toFront()এবং setVisible()

দয়া করে নোট করুন যে পদ্ধতিটি setVisible()সর্বদা EDT- এ আহ্বান করা উচিত।


ধন্যবাদ! এছাড়াও এর সাথে সম্পর্কিত এই প্রশ্ন হচ্ছে, stackoverflow.com/questions/2315560/...
rogerdpack

সেটডিসপোজড () পদ্ধতির কারণে এটি আমার দ্বারা সংকলন করে না। খুঁজে পাওয়া যায় না।
ka3ak

4
@ ka3ak এটি একটি সুরক্ষিত সেটার যা ফ্রেম নিষ্পত্তি হওয়ার সাথে সাথে পরিস্থিতি ট্র্যাক করার জন্য প্রস্তাবিত জেফ্রেম-বেস শ্রেণিতে চালু করা যেতে পারে। পদ্ধতি নিষ্পত্তি () সেটডিসপোজড (সত্য) -এর কল দিয়ে ওভাররাইড করা দরকার। এটি কঠোরভাবে সবার জন্য প্রয়োজন বলার অপেক্ষা রাখে না।
01 ই

4
.setAlwaysOnTop(true);একমাত্র আমার জন্য কাজ যখন একটি JWindow ব্যবহার ছিল।
ডিজিবার্গ

setAlwaysOnTop(true)আমি এটি উইন্ডোজ 10 এর অধীনে চলমান একমাত্র উপায় - ধন্যবাদ!
হার্টমুট পি।

23

উইন্ডোজ ফোকাস চুরি থেকে উইন্ডোজ প্রতিরোধ করার সুবিধা আছে; পরিবর্তে এটি টাস্কবারের আইকনটি ফ্ল্যাশ করে। এক্সপিতে এটি ডিফল্টরূপে চালু রয়েছে (এটি পরিবর্তনের জন্য আমি দেখেছি এমন একমাত্র জায়গা এটি টুইকইউআই ব্যবহার করছে, তবে কোথাও একটি রেজিস্ট্রি সেটিংস রয়েছে)। ভিস্টায় তারা ডিফল্ট পরিবর্তন করতে পারে এবং / বা-বাক্সের বাইরে ইউআইয়ের সাহায্যে এটি ব্যবহারকারী অ্যাক্সেসযোগ্য সেটিং হিসাবে প্রকাশ করতে পারে।

উইন্ডোজ 2K এর আগে থেকে নিজেকে জোর করা এবং ফোকাস নেওয়া থেকে বিরত রাখা একটি বৈশিষ্ট্য যা (এবং আমি এর জন্য কৃতজ্ঞ)।

এটি বলেছিল, আমার কাজ করার সময় আমার ক্রিয়াকলাপ রেকর্ড করার জন্য আমাকে স্মরণ করিয়ে দেওয়ার জন্য আমি একটি সামান্য জাভা অ্যাপ্লিকেশন ব্যবহার করি এবং এটি প্রতি 30 মিনিটে নিজেকে সক্রিয় উইন্ডোতে পরিণত করে (অবশ্যই কনফিগারযোগ্য)। এটি সর্বদা উইন্ডোজ এক্সপির অধীনে ধারাবাহিকভাবে কাজ করে এবং শিরোনাম বার উইন্ডোটি কখনই ঝলক দেয় না। এটি টাইমার ইভেন্টের গুলি ছোঁড়ার ফলাফল হিসাবে ইউআই থ্রেডে নিম্নলিখিত কোডটি ব্যবহার করে:

if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();

(প্রথম লাইনটি যদি ছোট করা হয় তবে পুনরুদ্ধার করা হয় ... আসলে এটি সর্বাধিক বৃদ্ধি পেলে এটি পুনরুদ্ধার করবে, তবে আমার এটি কখনও হয়নি)।

যদিও আমি সাধারণত এই অ্যাপ্লিকেশনটি ছোট করে ফেলেছি, প্রায়শই এটি আমার পাঠ্য সম্পাদকের পিছনে থাকে। এবং, যেমনটি আমি বলেছিলাম, এটি সর্বদা কার্যকর হয়।

আপনার সমস্যাটি কী হতে পারে সে সম্পর্কে আমার ধারণা আছে - সম্ভবত আপনার সেটভিসিবল () কলটির সাথে রেসের শর্ত রয়েছে। টুফ্রন্ট () উইন্ডোটি যখন ডাকা হয় তখন প্রকৃতপক্ষে প্রদর্শিত না হলে তা বৈধ হতে পারে না; অনুরোধফোকাস () এর আগেও আমার এই সমস্যাটি ছিল। উইন্ডো অ্যাক্টিভেটেড ইভেন্টে আপনাকে ইউআই শ্রোতার কাছে টফফ্রন্ট () কল লাগাতে হবে।

2014-09-07: একসময় উপরের কোডটি জাভা 6 বা 7 এ কাজ করা বন্ধ করে দিয়েছে কিছু তদন্ত এবং পরীক্ষার পরে আমাকে উইন্ডোটির toFrontপদ্ধতিটি ওভাররাইড করার জন্য কোডটি আপডেট করতে হয়েছিল (এটি থেকে সংশোধিত কোডের সাথে সংযুক্তিতে) উপরে):

setVisible(true);
toFront();
requestFocus();
repaint();

...

public @Override void toFront() {
    int sta = super.getExtendedState() & ~JFrame.ICONIFIED & JFrame.NORMAL;

    super.setExtendedState(sta);
    super.setAlwaysOnTop(true);
    super.toFront();
    super.requestFocus();
    super.setAlwaysOnTop(false);
}

জাভা 8_20 হিসাবে, এই কোডটি ঠিকঠাকভাবে কাজ করছে বলে মনে হচ্ছে।


4
উইন্ডোগুলিকে ফোকাস চুরি করতে না দেওয়ার পক্ষে সমর্থন করার জন্য +1। আমি যখন নথিতে টাইপ করি তখন যখন ঘটে তখন আমি ঘৃণা করি।
কেন পল

4
চুরি ফোকাসের বিরুদ্ধে আমি সম্পূর্ণরূপে আপনার সাথে একমত, তবে এই সুনির্দিষ্ট ক্ষেত্রে ব্যবহারকারী আবেদনটি সামনে আসবে বলে প্রত্যাশা করে। তবে রেজিস্ট্রি সেটিংস পরিবর্তন করতে এবং উইন্ডোর সম্পূর্ণ আচরণ পরিবর্তন করা শীতল হবে।
বাউত্তা

আমি অনুমান করছি super.setAlwaysOnTop(false);যে উইন্ডোটি সর্বদা শীর্ষে থাকে না, যা trueউইন্ডোটি সামনে আনার জন্য আমরা আগে সেট করেছিলাম তা থেকে মুক্তি পাওয়া দরকার , সঠিক? আমি জিজ্ঞাসা করছি কারণ আপনার কোড দিয়ে আমার ক্ষেত্রে উইন্ডোটি সর্বদা শীর্ষে থাকে যা আমি অবশ্যই চাই না। উইন্ডোজ 10-এ jre1.8.0_66 চলছে
ব্রাম ভ্যানরোয়

@ ব্র্যাম: হ্যাঁ এটি সঠিক। আমি জাভা এবং উইন্ডোজের একই সংস্করণে কোডটি চালাচ্ছি এবং এটি সর্বদা অন্যান্য উইন্ডোগুলির শীর্ষে শেষ হয় না। সর্বদা শীর্ষে স্থাপন করা প্রয়োজন হতে পারে না তবে আমি মনে করি অন্যথায় উইন্ডোজ কমপক্ষে কিছু শর্তে কেবল শিরোনাম বারটি চমকায়।
লরেন্স ডল

এইচএম, আজব। আপনি কি একই অনুরূপ প্রশ্নের দিকে নজর রাখতে পারেন যার সাথে আমি এই উত্তরের সাথে সংযুক্ত আছি? হয়তো যে কোড শো আরো পরিষ্কারভাবে ইস্যু: stackoverflow.com/questions/34637597/...
Bram স্বাগতম Vanroy

11

এখানে একটি পদ্ধতি যা সত্যই কাজ করে (উইন্ডোজ ভিস্তার উপর পরীক্ষিত): ডি

   frame.setExtendedState(JFrame.ICONIFIED);
   frame.setExtendedState(fullscreen ? JFrame.MAXIMIZED_BOTH : JFrame.NORMAL);

আপনি যদি অ্যাপ্লিকেশনটিকে পূর্ণ স্ক্রিনটি চালিত করতে চান বা উইন্ডোড করে থাকেন তবে পূর্ণস্ক্রিন পরিবর্তনশীলটি নির্দেশ করে indicates

এটি টাস্ক বারটি ফ্ল্যাশ করে না, তবে নির্ভরযোগ্যভাবে উইন্ডোটি সামনে নিয়ে আসে।


সেট এক্সটেন্ডেড স্টেট টিপের জন্য ধন্যবাদ উইন্ডোটি যদি ছোট করা হয় তবে অগ্রভাগে আনার জন্য আমি টফফ্রন্ট () এবং পুনরায় রঙ () সমাধান সহ এটি ব্যবহার করেছি।
ছিনিয়ে নিন

4
নিশ্চিত করা হয়েছে: টাস্ক বারে বার্তাটি ফ্ল্যাশ করার জন্য টফফ্রন্টের ফলাফল ব্যবহার করে এই সমাধানটি উইন্ডোজএক্সপিতে কাজ করে। ধন্যবাদ!
এরিক লিন্ডাউয়ার

5

এইচজেড, ফেডোরার কেডিআই 14 এ আপনার সমস্ত পদ্ধতি আমার পক্ষে কাজ করছে না I

import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.InputEvent;

public class FrameMain extends javax.swing.JFrame {

  //...
  private final javax.swing.JFrame mainFrame = this;

  private void toggleVisible() {
    setVisible(!isVisible());
    if (isVisible()) {
      toFront();
      requestFocus();
      setAlwaysOnTop(true);
      try {
        //remember the last location of mouse
        final Point oldMouseLocation = MouseInfo.getPointerInfo().getLocation();

        //simulate a mouse click on title bar of window
        Robot robot = new Robot();
        robot.mouseMove(mainFrame.getX() + 100, mainFrame.getY() + 5);
        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);

        //move mouse to old location
        robot.mouseMove((int) oldMouseLocation.getX(), (int) oldMouseLocation.getY());
      } catch (Exception ex) {
        //just ignore exception, or you can handle it as you want
      } finally {
        setAlwaysOnTop(false);
      }
    }
  }

  //...

}

এবং, এটি আমার ফেডোরার কেডিএ 14 :-) এ পুরোপুরি কাজ করে


একটু হ্যাকি, আমাদের জন্য কাজ করে তবে কেবল প্রথম কলটির জন্য :-)। (কুবুন্টু 12.04) - অন্যান্য সমাধান ব্যর্থ হয়েছে
ব্যবহারকারী 85155

এটিই ছিল আমার সমাধানের জন্য একমাত্র সমাধান (উইন্ডোজ সার্ভার ২০১২ আর 2) যেখানে একটি জেফ্রেম (লগইন) খোলা আছে তবে ব্যবহারকারী এতে ক্লিক না করা পর্যন্ত তার ফোকাস নেই।
গ্লেনারু

4

এই সহজ পদ্ধতিটি আমার জন্য উইন্ডোজ 7 এ পুরোপুরি কাজ করেছিল:

    private void BringToFront() {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                if(jFrame != null) {
                    jFrame.toFront();
                    jFrame.repaint();
                }
            }
        });
    }

4
repaint()প্রয়োজন নেই, invokeLater()এটা করেনি। ধন্যবাদ.
ম্যাথিউউ

4

আমি আপনার উত্তরগুলি পরীক্ষা করেছি এবং কেবল স্টিফান রেখই তার পক্ষে কাজ করেছে। যদিও আমি উইন্ডোটিকে তার আগের অবস্থায় পুনরুদ্ধার করতে পারি না (সর্বাধিক / স্বাভাবিক)। আমি এই রূপান্তরটি আরও ভাল পেয়েছি:

view.setState(java.awt.Frame.ICONIFIED);
view.setState(java.awt.Frame.NORMAL);

যে setStateপরিবর্তে setExtendedState


3

সবচেয়ে সহজ উপায় আমি খুঁজে পেয়েছি যে প্ল্যাটফর্ম জুড়ে অসামঞ্জস্যতা নেই:

সেটভিজিবল (মিথ্যা); setVisible (সত্য);


4
কিছুটা হলেও জ্বলজ্বলে সৃষ্টি করে? সুন্দর এবং সহজ যদিও :)
রজারডপ্যাক

আমার পটভূমি প্রক্রিয়া জন্য কাজ করে না। অগ্রভাগ প্রক্রিয়া থেকে যদি ডাকা হয় তবে উইন্ডোটি প্রথম রিফ্রেশের জন্য সাদা হয়। স্ক্রিন গ্রাবের জন্য ব্যবহার করতে পারবেন না।
ড্রাগনলর্ড

উইন্ডোটি আইকনযুক্ত হয়েছে কি না তা পরীক্ষা করে জ্বলজ্বলে এড়ানো যায়
টোটাম

2

আপনি যখন টফ্রন্টে () একটি জে ফ্রেম উইন্ডো এবং লিনাক্সে একই হন তখন কি হয় তা নিয়ন্ত্রন করার নিয়মগুলি:

-> যদি বিদ্যমান অ্যাপ্লিকেশনটির উইন্ডোটি বর্তমানে ফোকাসযুক্ত উইন্ডো হয় তবে অনুরোধ করা উইন্ডোটিতে ফোকাসটি অদলবদল করে -> যদি তা না হয় তবে উইন্ডোটি কেবল টাস্কবারে ঝলক দেয়

কিন্তু:

-> নতুন উইন্ডোজ স্বয়ংক্রিয়ভাবে ফোকাস পেতে

সুতরাং আসুন এটি কাজে লাগান! আপনি সামনে একটি উইন্ডো আনতে চান, এটি কিভাবে করবেন? আমরা হব :

  1. একটি খালি অ-উদ্দেশ্যমূলক উইন্ডো তৈরি করুন
  2. এটা দেখাও
  3. এটি স্ক্রিনে প্রদর্শিত হওয়ার জন্য অপেক্ষা করুন (সেটটি দৃশ্যমান তা করে)
  4. যখন প্রদর্শিত হবে, আপনি উইন্ডোটির জন্য ফোকাসটির অনুরোধ করুন যা আপনি আসলে ফোকাসটি আনতে চান
  5. খালি উইন্ডোটি লুকান, এটি ধ্বংস করুন

বা, জাভা কোডে:

// unminimize if necessary
this.setExtendedState(this.getExtendedState() & ~JFrame.ICONIFIED);

// don't blame me, blame my upbringing
// or better yet, blame java !
final JFrame newFrame = new JFrame();
newFrame.add(new JLabel("boembabies, is this in front ?"));

newFrame.pack();
newFrame.setVisible(true);
newFrame.toFront();

this.toFront();
this.requestFocus();

// I'm not 100% positive invokeLater is necessary, but it seems to be on
// WinXP. I'd be lying if I said I understand why
SwingUtilities.invokeLater(new Runnable() {
  @Override public void run() {
    newFrame.setVisible(false);
  }
});

উইন 7-তে কাজ করেনি, উভয় উইন্ডো ফ্ল্যাশ হয়েছে (যদি আমি ২ য় আড়াল না করি)।
NateS

সৃজনশীল। উইন্ডো 7 এ আমার পটভূমি প্রক্রিয়াটির জন্য কাজ করা হয়নি covered নতুন ফ্রেম শীর্ষে আসে না। পুরানো জেডিকে 6u21।
ড্রাগনলর্ড

0

টোফ্রন্ট () পদ্ধতির জন্য জাভাডোকে প্রচুর সংখ্যক সতর্কতা রয়েছে যা আপনার সমস্যার কারণ হতে পারে।

তবে আমি যাইহোক একটি অনুমান করব, যখন "টাস্কবারের কেবলমাত্র ট্যাবটি" জ্বলজ্বল হয়, তখন অ্যাপ্লিকেশনটি ছোট করা হয়? যদি তাই হয় তবে জাভাদোক থেকে নিম্নলিখিত লাইনটি প্রয়োগ করতে পারে:

"যদি এই উইন্ডোটি দৃশ্যমান হয় তবে এই উইন্ডোটি সামনে এনে দেয় এবং এটিকে কেন্দ্রীভূত উইন্ডোতে পরিণত করতে পারে।"


0

উইন্ডোটি ফোকাস হারাতে এড়ানোর জন্য যখন এটি প্রয়োজনীয় হয় তা গোপন করার পরে দৃশ্যমানটিতে ফিরে আসে:

setExtendedState(JFrame.NORMAL);

তাই ভালো:

defaultItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                showWindow();
                setExtendedState(JFrame.NORMAL);
            }
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.