سؤال

لدينا تطبيق جافا الذي يحتاج إلى المقدمة عندما telecontrol آلية ينشط شيء في التطبيق.

من أجل الحصول على هذا ، أدركنا في استدعاء الأسلوب من الطبقة التي تمثل الإطار التطبيق لدينا (تمديد JFrame) التنفيذ التالية:

setVisible(true);
toFront();

تحت ويندوز XP يعمل هذا أول مرة يطلق عليه في المرة الثانية فقط علامة تبويب في شريط المهام ومضات الإطار لا يأتي إلى الجبهة بعد الآن.الشيء نفسه ينطبق على Win2k.على ويندوز فيستا يبدو للعمل بشكل جيد.

هل لديك أية أفكار ؟

هل كانت مفيدة؟

المحلول

وأحد الحلول الممكنة هو:

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

نصائح أخرى

وكان لي نفس المشكلة مع جلب 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() دائما على بتوقيت شرق الولايات المتحدة.

ويندوز لديه منشأة إلى منع windows من سرقة التركيز ؛ بدلا من ذلك فإنه يومض رمز شريط المهام.في XP انها افتراضيا (المكان الوحيد الذي رأيت أن التغيير هو استخدام TweakUI ، ولكن هناك إعداد التسجيل في مكان ما).في ويندوز فيستا قد تغيرت الافتراضي و/أو يتعرض أنها يمكن للمستخدم الوصول إليها مع وضع الخروج من مربع واجهة المستخدم.

منع windows من إجبار أنفسهم على الجبهة و اتخاذ التركيز هو سمة منذ Windows 2K (و أنا ممتن لذلك).

وقال أن لدي القليل من التطبيق جافا كنت أذكر لي أن أسجل إعجابي الأنشطة أثناء العمل ، ويجعل نفسه الإطار النشط كل 30 دقيقة (شكلي بالطبع).وهو يعمل دائما على الدوام تحت ويندوز XP و لم يومض شريط عنوان النافذة.فإنه يستخدم البرمجية التالية ، ودعا في UI نتيجة توقيت الحدث إطلاق النار:

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

(السطر الأول يعيد إذا تصغير...في الواقع كان استعادته لو مكبر أيضا لكن لم يكون ذلك).

بينما عادة ما يكون هذا التطبيق المصغر ، في كثير من الأحيان ببساطة وراء بلدي محرر النص.و كما قلت, أنه يعمل دائما.

لدي فكرة عن ما يمكن أن يكون مشكلة - ربما لديك حالة سباق مع setVisible() المكالمة.toFront() قد لا تكون صالحة إلا إذا كانت نافذة في الواقع المعروضة عندما يتم يسمى ؛ لدي هذه المشكلة مع requestFocus() من قبل.قد تحتاج إلى وضع toFront() الدعوة في واجهة المستخدم المستمع على نافذة تفعيل الحدث.

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 ، هذا الرمز يبدو أن تعمل بشكل جيد.

وفيما يلي الطريقة التي يعمل حقا (اختبار على ويندوز فيستا): D

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

والمتغير ملء الشاشة يشير إلى ما إذا كنت تريد التطبيق لتشغيل كامل الشاشة أو إطارات.

وهذا لا فلاش شريط المهام، ولكن جعل نافذة إلى الأمام بشكل موثوق.

والحاج، وكلها أساليب لك لا تعمل بالنسبة لي، في فيدورا KDE 14. لدي وسيلة قذرة للقيام جلب نافذة إلى الأمام، بينما نحن في انتظار أوراكل لإصلاح هذه المشكلة.

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);
      }
    }
  }

  //...

}

و، وهذا يعمل تماما في بلدي فيدورا KDE 14: -)

وعملت هذه طريقة بسيطة بالنسبة لي تماما في ويندوز 7:

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

واختبرت إجاباتك وفقط واحد ستيفان الرايخ عملت بالنسبة لي. على الرغم من أنني لا يمكن أن ينجح في استعادة الإطار إلى حالته السابقة (تكبير / عادي). لقد وجدت هذه الطفرة أفضل:

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

وهذا هو setState بدلا من setExtendedState.

وأبسط طريقة وجدتها الذي ليس لديه تضارب عبر منصات:

وsetVisible (كاذبة)؛ setVisible (صحيح)؛

القواعد التي تحكم ما يحدث عندما .toFront() a JFrame هي نفسها في ويندوز في لينكس :

-> إذا كان نافذة التطبيق الموجود حاليا تركز النافذة ، ثم التركيز مقايضة المطلوبة نافذة -> إذا لم النافذة مجرد ومضات في شريط المهام

ولكن :

-> ويندوز جديد تلقائيا على التركيز

لذلك دعونا استغلال هذا !كنت تريد أن تجلب نافذة إلى الجبهة ، كيف نفعل ذلك ؟ حسنا :

  1. خلق فارغة غير الغرض نافذة
  2. تظهر
  3. انتظر حتى تظهر على الشاشة (setVisible يفعل ذلك)
  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);
  }
});

هناك العديد من المحاذير في جافادوك عن toFront (طريقة) التي قد تسبب المشكلة.

ولكن سآخذ أعتقد على أي حال ، عندما "فقط علامة تبويب في شريط المهام ومضات" ، تطبيق تم تصغير?إذا كان السطر التالي من جافادوك قد تنطبق:

"إذا كان هذا الإطار هو مرئي ، يجلب هذه النافذة الأمامية و قد تجعل من نافذة تركيزا."

لتجنب نافذة فقدان التركيز عند عودته لوضوحا بعد أن مخبأة كل ما هو مطلوب هو:

setExtendedState(JFrame.NORMAL);

ومثل ذلك:

defaultItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                showWindow();
                setExtendedState(JFrame.NORMAL);
            }
});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top