Musk dijo que Dogecoin es increíble, dije que la idea del complemento te ayuda a vigilar a los peces

Caballo viejo y caballo viejo


Hace unos días, Musk no solo tuiteó que su criptomoneda favorita puede ser Dogecoin, sino que también cambió el perfil de su cuenta de Twitter a "Ex CEO de Dogecoin".

Una generación de "maestros de carga", "Silicon Valley Iron Man", parece ser un poco testarudo después de convertirse en el hombre más rico. Esta es una pelea con Boss Ma. Ambos caballos viejos son tan impresionantes, que me lo recuerda. Una oración en el esbozo de Song Dandan: "Todos son celebridades como esta". Cuando son ricos, serán obstinados. Estas cosas parecen estar escritas en los genes de las personas.

Musk agitó la bandera del círculo monetario, lo que llevó directamente a una ola de precios al alza. Algunas personas estaban felices y otras preocupadas. Fue realmente animado. Por supuesto, como un idiota que no especula con monedas, la emoción de los demás no tiene nada que ver conmigo. Después de todo, él es pobre y tímido. Sin embargo, como informático en el trabajo, cómo ver la moneda digital en los párpados de su jefe, esto todavía se puede considerar, después de todo, este es un negocio que sube y baja millones de minutos, y servir puerros es una misión muy importante.

Cómo esconderse del jefe


Como desarrollador de Android, tu trabajo es escribir código en Android Studio. Si sales de la página de Android Studio, básicamente puedes pensar que estás pescando, y Android Studio se desarrolló en base a la idea. Se encontró que la idea plug- es sin duda la mejor opción.

Desarrollo


efecto

Se puede ver por el efecto de que se crea una ventana de herramientas en la idea, la información de la moneda se muestra en la ventana de herramientas y se actualiza cada 30 segundos.

Adquisición de API

La API de información de mercado se obtiene a través de la API pública no pequeña. Para el documento, consulte: ** https://github.com/xiaohao2019/API-docs/blob/master/PublicApi_CN.md **

Adquisición de datos

A través de la API anterior, los datos de mercado de la moneda cifrada se obtienen regularmente, y luego los datos se empaquetan y envían a través de EventBus, y luego los datos se reciben y se muestran en BitCoinWindow.

object TickerNetDataApi {

    private var isStart = false

    private var lastTickerDataList: List<TickerData>? = null

    fun scheduleGetTickerData() {
        if (!isStart) {
            val scheduledExecutorService = Executors.newSingleThreadScheduledExecutor()
            scheduledExecutorService.scheduleAtFixedRate(Runnable {
                getTickerData()
            }, 0, 30, TimeUnit.SECONDS)
            isStart = true
        }
    }

    fun getTickerData() {
        val uri = "https://fxhapi.feixiaohao.com/public/v1/ticker"
        val paratmers: MutableList<NameValuePair> =
            ArrayList()
        paratmers.add(BasicNameValuePair("start", "0"))
        paratmers.add(BasicNameValuePair("limit", "100"))
        try {
            val tickerDataList = makeAPICall(uri, paratmers)
            tickerDataList?.let {
                val lastData = lastTickerDataList
                if (lastData == null || lastData[0].last_updated > it[0].last_updated) {
                    org.greenrobot.eventbus.EventBus.getDefault().post(TickerDataEvent(tickerDataList))
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }

    }

    @Throws(URISyntaxException::class, IOException::class)
    fun makeAPICall(uri: String, parameters: List<NameValuePair?>?): List<TickerData>? {
        var responseContent: String? = ""
        val query = URIBuilder(uri)
        query.addParameters(parameters)
        val client = HttpClients.createDefault()
        val request = HttpGet(query.build())
        request.setHeader(HttpHeaders.ACCEPT, "application/json")
        val response = client.execute(request)
        response.use { response ->
            println(response.statusLine)
            val entity = response.entity
            responseContent = EntityUtils.toString(entity)
            EntityUtils.consume(entity)
        }
        return responseContent?.let {
            GsonUtil.fromJson(it, object : TypeToken<List<TickerData>>() {
            }.type)
        }
    }


}

Crear ventana de herramientas

ToolWindow es una subventana de ide, generalmente utilizada para mostrar información. La más común es el directorio de estructura del proyecto en el proceso de desarrollo de Android.

El método para crear ToolWindow es todavía muy simple. Primero, cree BitCoinToolWindowFactory heredado de ToolWindowFactory

class BitCoinToolWindowFactory : ToolWindowFactory {

    override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) {
        val bitCoinWindow = BitCoinWindow()
        val contentFactory = ContentFactory.SERVICE.getInstance()
        val content =
            contentFactory.createContent(bitCoinWindow.getContent(), "", false)
        toolWindow.contentManager.addContent(content)
        TickerNetDataApi.scheduleGetTickerData()
    }

}

BitCoinWindow es la interfaz de usuario que se usa para mostrar información. El complemento de idea generalmente usa swing para construir la interfaz de usuario. Aquí, JTableLayout se usa para mostrar la tabla de la interfaz de usuario.

package com.skateboard.coinsplugin.ui

import com.skateboard.coinsplugin.data.TickerDataEvent
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import java.util.*
import javax.swing.JPanel
import javax.swing.JScrollPane
import javax.swing.JTable
import javax.swing.table.DefaultTableModel
import javax.swing.table.TableColumn

class BitCoinWindow {

    private lateinit var contentPanel: JPanel

    private lateinit var contentScrollPane: JScrollPane

    private lateinit var coinsTable: JTable

    private val columnList =
        listOf("排名", "名称", "最新价格", "24h的成交额", "流通市值", "流通数量", "总发行量", "最大发行量", "1小时涨跌幅", "24小时涨跌幅", "7天涨跌幅", "更新时间")

    init {
        EventBus.getDefault().register(this)
        val tableModel = coinsTable.model as DefaultTableModel
        for (index in columnList.indices) {
            val column = columnList[index]
            tableModel.addColumn(column)
        }
        coinsTable.autoResizeMode = JTable.AUTO_RESIZE_OFF
    }

    fun getContent(): JPanel = contentPanel

   //更新数据
    @Subscribe(threadMode = ThreadMode.MAIN)
    fun onTickerDataEvent(event: TickerDataEvent) {
        if (coinsTable.rowCount <= 0) {
            for (tickerData in event.tickerDataList) {
                val tableModel = coinsTable.model as DefaultTableModel
                tableModel.addRow(tickerData.toArray())
            }
        } else {
            val tableModel = coinsTable.model as DefaultTableModel
            val rowVector = Vector<Vector<String>>()
            for (tickerData in event.tickerDataList) {
                rowVector.add(tickerData.toVector())
            }
            tableModel.setDataVector(rowVector, Vector(columnList))
            coinsTable.repaint()
        }
        fitTableColumns(coinsTable)
    }

   //适配表格宽度
    private fun fitTableColumns(myTable: JTable) {
        val header = myTable.tableHeader
        val rowCount = myTable.rowCount
        val columns = myTable.columnModel.columns
        while (columns.hasMoreElements()) {
            val column = columns.nextElement() as TableColumn
            val col = header.columnModel.getColumnIndex(column.identifier);
            var width = (myTable.tableHeader.defaultRenderer.getTableCellRendererComponent(
                myTable, column.identifier
                , false, false, -1, col
            ).preferredSize.getWidth()).toInt()
            for (row in 0 until rowCount) {
                val preferedWidth = (myTable.getCellRenderer(row, col).getTableCellRendererComponent(
                    myTable,
                    myTable.getValueAt(row, col), false, false, row, col
                ).preferredSize.getWidth()).toInt()
                width = width.coerceAtLeast(preferedWidth)
            }
            header.resizingColumn = column
            column.width = width + myTable.intercellSpacing.width;
        }
    }
}

Registrarse en el archivo de configuración

Registre BitCoinToolWindowFactory que acaba de crear en plugin.xml

<idea-plugin>
    <id>org.example.bitcoinplugin</id>
    <name>比特币行情插件</name>
    <vendor email="[email protected]" url="http://www.yourcompany.com">YourCompany</vendor>

    <description><![CDATA[
    Enter short description for your plugin here.<br>
    <em>most HTML tags may be used</em>
    ]]></description>

    <!-- please see https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
         on how to target different products -->
    <depends>com.intellij.modules.platform</depends>

    <extensions defaultExtensionNs="com.intellij">
        <toolWindow id="绿油油" secondary="true" icon="AllIcons.General.Modified" anchor="right"
                    factoryClass="com.skateboard.coinsplugin.ui.BitCoinToolWindowFactory"/>
    </extensions>

    <actions>
        <!-- Add your actions here -->
    </actions>
</idea-plugin>

El nombre de ToolWindow aquí es Green Oil, que se siente más en línea con el temperamento de este complemento.

Por fin


Por supuesto, este complemento no se puede utilizar como una herramienta de seguimiento de disco real, porque la interfaz es un poco inestable y no lo suficientemente oportuna. Es solo una pequeña demostración escrita como un complemento de idea. No sea demasiado real, y adjunte la dirección del proyecto
** https: //github.com/skateboard1991/Chives **

Buscando atención


Cuenta pública de WeChat: el viejo arsénico en la patineta
imagen

Supongo que te gusta

Origin blog.csdn.net/skateboard1/article/details/113773712
Recomendado
Clasificación